我有以下课程
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();
}
}我希望能够在运行时加载一个dll,其中包含一个名为"Module“的类,其接口为"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());然而,v总是崩溃在铸造部分说
{“无法将'WAM.Modules.AlertScanner.Module‘类型的对象强制转换为’WAM.Shared.Interfaces.IModule‘”}
更新:
目前我只有一个dll : WAM.Modules.AlertScanner.dll
也只有一个exe : WAM.Desktop.exe
解决方案中有3个项目:
这里有太多的类要列出,但是在这个上下文中使用的类:
ManagerModules应该在运行时加载一个名为Module的类继承IModule的DLL。WAM.Shared在WAM.Desktop (使用管理器的)和WAM.Modules.AlertScanner (用于继承)中引用。
更新2 :
问题似乎是我的代码生成了两个版本的接口。
是否有办法使它只保留一个版本的接口?
发布于 2015-03-27 14:31:36
由于我没有得到任何关于我的问题的明确答案,并且我设法纠正了这个问题,所以我在张贴我的解决方案,以防其他人有同样的问题:
发布于 2015-03-21 07:05:41
类WAM.Modules.AlertScanner.Module实现WAM.Modules.AlertScanner.IModule。您正在尝试向WAM.Shared.Interfaces.IModule转换。认为WAM.Modules.AlertScanner.IModule和WAM.Shared.Interfaces.IModule看起来是一样的,有着相同的签名,因为它们在不同的名称空间中是不同的。您需要将适配器从WAM.Modules.AlertScanner.IModule写到WAM.Shared.Interfaces.IModule
https://stackoverflow.com/questions/29172463
复制相似问题