c#加载程序集/通用引用

本文关键字:引用 加载 程序集 | 更新日期: 2023-09-27 18:13:01

我遇到了一个小问题-我正在编写一个加载DLL的程序,每个DLL都包含一个类,该类继承自一个库中存在的类,该库由加载的DLL和加载DLL的"主机"程序引用。这里的问题是,当我尝试加载并强制转换到超类:

var assembly = Assembly.LoadFrom(dllPath);
var type = assembly.GetTypes().FirstOrDefault(x => x.IsSubclassOf(typeof (MySuperclass)));
...

虽然两者都引用包含MySuperclass的类,但由于dll引用的是构建的类库(与加载程序引用的类库文件分开的文件),IsSubclassOf永远不会返回true,因为它认为这两个类不同,因为它们来自两个不同的程序集。

此外,如果您尝试将已加载类的已创建实例强制转换为超类类型,则无法做到这一点,因为它们不相同(不同的程序集)。

所以,我的问题是:你如何处理引用公共代码的加载程序集,以便c#识别你正在加载一个继承自公共超类的类?

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/; -程序将在这些位置搜索依赖项。

祖先类(超类)必须来自同一个程序集,以便加载代码有机会将后代类作为超类引用。