在C#中,要实现动态加载,可以使用反射和动态编译的方法。这里给出一个简单的示例,展示如何使用动态编译的方法来实现插件的动态加载。
public interface IPlugin
{
string Name { get; }
void Execute();
}
public class PluginLibrary
{
private Dictionary<string, Assembly> _assemblies = new Dictionary<string, Assembly>();
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和反射来完成。