我正在尝试用C#实现一个插件系统,为此我创建了以下类和接口:
包含在loader和plugin中:
interface IDevicePlugin {
string GetName();
string GetVersion();
}
插件代码(编译为.dll)
public class DummyPlugin : IDevicePlugin {
protected string name;
protected string version;
public string GetName() {
return name;
}
public string GetVersion() {
return version;
}
}
加载插件的代码如下:
IDevicePlugin thePlugin;
Assembly plugin = Assembly.LoadFrom("plugin.dll");
foreach (Type pluginType in plugin.GetTypes()) {
if (pluginType.IsPublic && !pluginType.IsAbstract) {
Type typeInterface = pluginType.GetInterface("IDevicePlugin", true);
if (typeInterface != null) {
// the plugin implements our IDevicePlugin interface
thePlugin = (IDevicePlugin)Activator.
CreateInstance(plugin.GetType(pluginType.ToString()));
}
}
}
这会崩溃:
Unable to cast object of type 'PluginTest.DummyPlugin' to type 'PluginTest.IDevicePlugin'.
答案 0 :(得分:8)
界面存在两次:
一旦进入你的plugin.dll,一次进入你的装载机
原因是您向包含插件项目的接口定义的* .cs文件添加了引用(= link)。此外,相同的* .cs文件是加载器项目的一部分
因此,接口被编译到两个程序集中。这是两个不同的接口,即使它们的名称相同!
要解决此问题,您应该执行以下操作:
将Loader 项目的引用添加到插件项目
中
- 或 -
为接口创建一个新项目,并从加载器和插件项目中引用该项目。