c# - 尝试在接口(interface)的实现中进行转换

标签 c#

我正在尝试用 C# 实现一个插件系统,为此我创建了以下类和接口(interface):

包含在加载器和插件中:

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'.

最佳答案

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

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

将加载器项目的引用添加到插件项目
- 或者 -
为界面创建一个新项目,并从加载程序和插件项目中引用该项目。

关于c# - 尝试在接口(interface)的实现中进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12215571/

相关文章:

C# 验证 PDF 签名

c# - 如何在 Visual Studio 中调试时查看 ViewBag 内容?

c# - WPF DataGrid 中选定行的前景色未更新

c# - 根据时间通过 LINQ to Entities (EF) 连接同一个表

c# - 处理 WPF 中的无效图像源

c# - 在 .net Web 浏览器控件中突出显示文本

c# - 如何在 Visual Studio 中生成包含所有属性的 ToString()?

c# - 转发器中的寻呼

c# - C#:使用无参数在功能上处于条件状态时?

c# - 开发类似于ASP.NET session 的系统时要考虑的安全性注意事项