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