无法将 Class 从动态加载的 DLL 转换为接口
Cannot cast Class to Interface from dynamically loaded DLL
我有以下class
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" 的 class 和接口 "IModule" 的 dll,并将其转换为所述接口。
我在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 总是在铸造部分崩溃说
{"Unable to cast object of type 'WAM.Modules.AlertScanner.Module' to type 'WAM.Shared.Interfaces.IModule'."}
更新:
目前我只有一个dll : WAM.Modules.AlertScanner.dll
也只有一个exe:WAM.Desktop.exe
解决方案中有 3 个项目:
- WAM.Desktop(Windows应用)
- WAM.Shared(共享项目)
- WAM.AlertScanner(Class 图书馆)
有太多 class 无法在此处列出,但在此上下文中使用的是:
- 模块(WAM.Modules.AlertScanner)
- 模块 (WAM.Shared)
- ManagerModules (WAM.Shared)
ManagerModules 应该在运行时加载 DLL,这些 DLL 有一个 class 称为继承 IModule 的模块。 WAM.Shared 在 WAM.Desktop(使用管理器的那个)和 WAM.Modules.AlertScanner(用于继承)中引用。
更新 2:
问题似乎是我的代码生成了 2 个版本的界面。
有没有办法让它只保留一个版本的界面?
Class 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
由于我没有得到关于我的问题的任何明确答案并且我设法纠正了问题,所以我发布了我的解决方案以防其他人遇到同样的问题:
- 正如其他人所说,我在每个程序集中都有一个版本的界面,这就是错误的原因。
- 出现这些多个版本的原因是我在共享项目中添加了界面。共享项目有助于集中代码,但是在编译时每个程序集都会生成自己的代码,这导致了我所处的情况。
- 解决方案相当简单:将接口移动到另一个程序集中(我将它移动到 class 库中)并使用该接口在程序集中添加对该程序集的引用。
我有以下class
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" 的 class 和接口 "IModule" 的 dll,并将其转换为所述接口。
我在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 总是在铸造部分崩溃说
{"Unable to cast object of type 'WAM.Modules.AlertScanner.Module' to type 'WAM.Shared.Interfaces.IModule'."}
更新:
目前我只有一个dll : WAM.Modules.AlertScanner.dll
也只有一个exe:WAM.Desktop.exe
解决方案中有 3 个项目:
- WAM.Desktop(Windows应用)
- WAM.Shared(共享项目)
- WAM.AlertScanner(Class 图书馆)
有太多 class 无法在此处列出,但在此上下文中使用的是:
- 模块(WAM.Modules.AlertScanner)
- 模块 (WAM.Shared)
- ManagerModules (WAM.Shared)
ManagerModules 应该在运行时加载 DLL,这些 DLL 有一个 class 称为继承 IModule 的模块。 WAM.Shared 在 WAM.Desktop(使用管理器的那个)和 WAM.Modules.AlertScanner(用于继承)中引用。
更新 2:
问题似乎是我的代码生成了 2 个版本的界面。
有没有办法让它只保留一个版本的界面?
Class 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
由于我没有得到关于我的问题的任何明确答案并且我设法纠正了问题,所以我发布了我的解决方案以防其他人遇到同样的问题:
- 正如其他人所说,我在每个程序集中都有一个版本的界面,这就是错误的原因。
- 出现这些多个版本的原因是我在共享项目中添加了界面。共享项目有助于集中代码,但是在编译时每个程序集都会生成自己的代码,这导致了我所处的情况。
- 解决方案相当简单:将接口移动到另一个程序集中(我将它移动到 class 库中)并使用该接口在程序集中添加对该程序集的引用。