无法从动态加载的DLL转换类到接口

时间:2015-03-20 17:27:13

标签: c# dll dllimport

我有以下课程

namespace WAM.Modules.AlertScanner
{
  public class Module : IModule
  {
    private Page _main;
    private Page _options;
    private String _name;
    private ViewModels.AlertScanner _scanner;

    public Page MainPage()
    {
        return _main;
    }

    public Page OptionsPage()
    {
        return _options;
    }

    public string Name()
    {
        return _name;
    }

    public Module()
    {
        _name = "Alert Scanner";
        _scanner = new ViewModels.AlertScanner();
        _main = new Views.Main(_scanner.Main_Data);
        _options = new Views.Options(_scanner.Options_Data);
    }
  }
}

和界面

namespace WAM.Shared.Interfaces
{
  interface IModule
  {
    Page MainPage();

    Page OptionsPage();

    String Name();
  }
}

我希望能够在运行时加载一个包含名为“Module”的类的dll,并带有一个接口“IModule”并将其转换为所述接口。

我在SO上找到了以下代码并稍微改了一下以获得以下内容

string fullpath = Path.GetFullPath(path);
Assembly ass = Assembly.LoadFrom(fullpath);
Type t = ass.GetType("WAM.Modules.AlertScanner.Module");
var o = Activator.CreateInstance(t);
IModule module = (IModule)o;
Console.WriteLine("Module : {0}", module.Name());

然而,VS总是在铸造部分崩溃说

  

{“无法将'WAM.Modules.AlertScanner.Module'类型的对象强制转换为'WAM.Shared.Interfaces.IModule'。”}

更新:

目前我只有一个dll:WAM.Modules.AlertScanner.dll

也只有一个exe:WAM.Desktop.exe

解决方案中有3个项目:

  • WAM.Desktop(Windows应用程序)
  • WAM.Shared(共享项目)
  • WAM.AlertScanner(班级图书馆)

此处列出的类太多,但在此上下文中使用的类:

  • 模块(WAM.Modules.AlertScanner)
  • IModule(WAM.Shared)
  • ManagerModules(WAM.Shared)

ManagerModules应该在运行时加载具有继承IModule的名为Module的类的DLL。 WAM.Shared在WAM.Desktop(使用管理器的那个)和WAM.Modules.AlertScanner(用于继承)中引用。

更新2:

问题似乎是我的代码生成了2个版本的界面。

有没有办法让它只保留一个版本的界面?

2 个答案:

答案 0 :(得分:1)

由于我没有得到关于我的问题的任何明确答案,我设法纠正了问题,我发布了我的解决方案以防其他人遇到同样的问题:

  • 正如其他人所说,我在每个程序集中都有一个版本的接口,这是导致错误的原因。
  • 这些多个版本的原因是我在共享项目中添加了界面。共享项目有助于集中代码,但是在编译时,每个程序集都会生成自己的代码,从而导致我所处的情况。
  • 解决方案相当简单:在另一个程序集中移动接口(我在类库中移动它)并使用接口在程序集中添加对该程序集的引用。

答案 1 :(得分:0)

班级WAM.Modules.AlertScanner.Module实施WAM.Modules.AlertScanner.IModule。您正试图转发WAM.Shared.Interfaces.IModule。思想WAM.Modules.AlertScanner.IModuleWAM.Shared.Interfaces.IModule看起来相同,具有相同的签名,它们是不同的,因为它们位于不同的名称空间中。您需要将适配器从WAM.Modules.AlertScanner.IModule写入WAM.Shared.Interfaces.IModule