C# 中如何开发插件

原理

写接口、写类、生成 DLL、动态加载 DLL。

加载示例

private void LoadMonitoringFactories()
{
	IMonitoringFactories = new List<IMonitoringFactory>();

	string pluginsPath = AppDomain.CurrentDomain.BaseDirectory + "\plugins";
	if (!Directory.Exists(pluginsPath))
	{
		return;
	}

	string[] files = Directory.GetFiles(pluginsPath, "*.dll"); // pluginsPath 必须存在,否则 Directory.GetFiles 报错。
	foreach (string file in files)
	{
		// 获取程序集。
		Assembly assembly = Assembly.LoadFrom(file);
		// 获取所有类。
		foreach (Type type in assembly.GetTypes())
		{
			// 判断该类是否是实现了接口。
			if (type.GetInterface(nameof(IMonitoringFactory)) == typeof(IMonitoringFactory))
			{
				// 创建实例类,并加入。
				IMonitoringFactory obj = (IMonitoringFactory)assembly.CreateInstance(type.FullName);
				IMonitoringFactories.Add(obj);
			}
		}
	}
}

如上,从 plugins 文件夹中加载 dll 文件,然后判断是不是对应的 IMonitoringFactory,是,则创建 Instance,并加入 List,供后面调用。

关于目录,我们这里用的是:AppDomain.CurrentDomain.BaseDirectory,我觉得这样更保险,因为如果是“服务”的话,它能保证路径就是我们当前 exe 文件所在的路径,而不是 C:Windowssystem32。

你可能感兴趣的