在C#中,要实现动态加载,可以使用反射和动态编译的方法。这里给出一个简单的示例,展示如何使用动态编译的方法来实现插件的动态加载。
- 首先,创建一个插件接口,所有插件需要实现这个接口:
public interface IPlugin { string Name { get; } void Execute(); }
- 创建一个插件库,用于存储所有插件的程序集:
public class PluginLibrary
{
private Dictionary _assemblies = new Dictionary();
public void AddAssembly(string assemblyName, Assembly assembly)
{
_assemblies[assemblyName] = assembly;
}
public IPlugin GetPlugin(string assemblyName, string className)
{
if (_assemblies.TryGetValue(assemblyName, out Assembly assembly))
{
Type type = assembly.GetType(className);
if (type != null && typeof(IPlugin).IsAssignableFrom(type))
{
return (IPlugin)Activator.CreateInstance(type);
}
}
return null;
}
}
- 创建插件实现:
public class PluginA : IPlugin { public string Name => "PluginA"; public void Execute() { Console.WriteLine("PluginA executed."); } }
- 在程序中动态加载插件:
public class Program
{
public static void Main(string[] args)
{
PluginLibrary pluginLibrary = new PluginLibrary();
// 加载插件程序集
Assembly assembly = Assembly.LoadFrom("PluginA.dll");
pluginLibrary.AddAssembly("PluginA", assembly);
// 获取并执行插件
IPlugin plugin = pluginLibrary.GetPlugin("PluginA", "PluginA");
if (plugin != null)
{
plugin.Execute();
}
else
{
Console.WriteLine("Plugin not found.");
}
}
}
注意:这个示例中的插件是静态加载的,为了实现动态加载,你需要将插件程序集存储在一个外部文件中(如DLL文件),然后在运行时动态加载它们。这可能需要使用文件I/O和反射来完成。