C#加载装配有共同参考

时间:2013-05-10 02:00:32

标签: c# reflection dll .net-assembly system.reflection

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

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

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

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

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

2 个答案:

答案 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)

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