试图强制执行Interface

时间:2012-08-31 12:39:22

标签: c#

我正在尝试用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'.

1 个答案:

答案 0 :(得分:8)

界面存在两次:
一旦进入你的plugin.dll,一次进入你的装载机 原因是您向包含插件项目的接口定义的* .cs文件添加了引用(= link)。此外,相同的* .cs文件是加载器项目的一部分 因此,接口被编译到两个程序集中。这是两个不同的接口,即使它们的名称相同!

要解决此问题,您应该执行以下操作:

将Loader 项目的引用添加到插件项目
中 - 或 -
为接口创建一个新项目,并从加载器和插件项目中引用该项目。