我有以下课程
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个项目:
此处列出的类太多,但在此上下文中使用的类:
ManagerModules应该在运行时加载具有继承IModule的名为Module的类的DLL。 WAM.Shared在WAM.Desktop(使用管理器的那个)和WAM.Modules.AlertScanner(用于继承)中引用。
更新2:
问题似乎是我的代码生成了2个版本的界面。
有没有办法让它只保留一个版本的界面?
答案 0 :(得分:1)
由于我没有得到关于我的问题的任何明确答案,我设法纠正了问题,我发布了我的解决方案以防其他人遇到同样的问题:
答案 1 :(得分:0)
班级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