0

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

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

尽管两者都引用了包含 MySuperclass 的类,但由于 dll 引用的是构建的类库(加载程序引用的类库文件中的一个单独文件),IsSubclassOf 永远不会返回 true,因为它认为这两个类在出现时是不同的来自两个不同的组件。

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

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

4

2 回答 2

1

如果您希望程序使用通用代码一起工作,您只需使用相同的汇编文件(即使它们相同)。这是我解决问题的方法:

该程序正在从它自己的子目录加载一个 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/;程序将搜索依赖项的这些位置。

于 2013-05-10T23:48:38.707 回答
-1

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

于 2013-05-10T02:22:17.040 回答