我遇到了一个小问题 - 我正在编写一个加载DLL的程序,每个程序包含一个类,该类继承自加载的DLL和“host”程序引用的库中存在的类。正在加载DLL。这里的问题是,当我尝试加载并强制转换为超类时:
var assembly = Assembly.LoadFrom(dllPath);
var type = assembly.GetTypes().FirstOrDefault(x => x.IsSubclassOf(typeof (MySuperclass)));
...
虽然两者都引用了包含MySuperclass的类,但由于dll引用了构建的类库(加载程序引用的类库文件中的单独文件),IsSubclassOf永远不会返回true,因为它认为这两个类是不同的因为他们来自两个不同的集会。
此外,如果您尝试将已加载类的已创建实例强制转换为超类类型,则它无法执行此操作,因为它们不相同(不同的程序集)。
所以,我的问题是:如何处理引用公共代码的加载程序集,以便c#识别出你正在加载一个继承了公共超类的类?
答案 0 :(得分:1)
如果希望程序使用公共代码一起工作,则必须使用相同的程序集文件(即使它们完全相同)。以下是我解决问题的方法:
程序正在从自己的子目录中加载DLL。
文件夹结构:
MyApp Folder -->
MyProgram.exe
CommonDependency.dll
Submodules ->
MySubmodule.dll
要让MySubmodule在下一个文件夹中使用CommonDependency.dll,它非常简单。将Visual Studio配置为不将这些dll依赖项复制到build文件夹。接下来,在Visual Studio中创建一个App.config并添加以下内容:
<configuration>
<runtime>
<assemblyBinding>
<probing privatePath="../"/>
</assemblyBinding>
</runtime>
</configuration>
这将告诉系统在父文件夹../
中搜索程序集 - 如果你想拥有多个文件夹,可能是一个单独的依赖文件夹(相对于.dll的位置),你可以使用{ {1}}作为分隔符 - ;
- 程序将在这些位置搜索依赖项。
答案 1 :(得分:-1)
祖先类(超类)必须来自同一个程序集,以便加载代码可以作为超类引用使用后代。