首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从动态加载的DLL转换类到接口

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

Stack Overflow用户
提问于 2015-03-20 17:27:12
回答 2查看 1.5K关注 0票数 1

我有以下课程

代码语言:javascript
复制
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);
    }
  }
}

和一个接口

代码语言:javascript
复制
namespace WAM.Shared.Interfaces
{
  interface IModule
  {
    Page MainPage();

    Page OptionsPage();

    String Name();
  }
}

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

我在SO上找到了下面的代码,并对其做了一些修改,以获得以下内容

代码语言:javascript
复制
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());

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

{“无法将'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应该在运行时加载一个名为Module的类继承IModule的DLL。WAM.Shared在WAM.Desktop (使用管理器的)和WAM.Modules.AlertScanner (用于继承)中引用。

更新2 :

问题似乎是我的代码生成了两个版本的接口。

是否有办法使它只保留一个版本的接口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 14:31:36

由于我没有得到任何关于我的问题的明确答案,并且我设法纠正了这个问题,所以我在张贴我的解决方案,以防其他人有同样的问题:

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

Stack Overflow用户

发布于 2015-03-21 07:05:41

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29172463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档