动态加载的程序集引用问题

时间:2011-11-04 20:38:27

标签: c# dll dynamic assembly-resolution

我有一个程序集A,此程序集动态加载程序集BCE。并且它将来会加载更多。

问题一:
B引用FG,当我尝试在B A中声明的类型实例中执行方法时,我得到一个异常告诉我当然没有发现F 问题:

  1. 当我动态加载程序集时,如何引用FG B,假设FGB位于同一文件夹中?
  2. 当我动态加载程序集时,如何引用FG B,假设FG位于不同的文件夹中?
  3. 问题二:
    这几乎是因为,在尝试快速测试某些功能时,我将引用的程序集从B的二进制文件夹复制到A,这导致以下例外:

      

    无法加载文件或程序集' log4net,版本= 1.2.10.0,   Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其中一个   依赖。定位程序集的清单定义没有   匹配程序集引用。 (HRESULT异常:0x80131040)

    我认为这是因为我使用log4net的不同版本而不是B的某个依赖关系。 的 问题:
    我可以采取什么措施来避免这种版本问题? 修复问题会解决这个问题吗?如果没有,为什么?


    我应该使用Autofac吗? 它会帮助我吗?怎么样?

    请记住,汇编A的想法是采用"插件",并按顺序,声明性地指向汇编或其依赖关系不是一个选项

1 个答案:

答案 0 :(得分:3)

只要程序集在版本中兼容,就可以指示CLR加载特定版本,而不管编译所依赖的程序集是什么版本。

例如,将此代码段添加到配置文件中会将System.Web.Mvc程序集的1.0.0.0-2.0.0.0重定向到3.0.0.0。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

您可以对任何装配使用相同的原理,例如log4net的。

尽管如此,您首选的解决方案应该是获取针对正确的程序集版本编译的版本。例如,log4net在源代码中可用,因此易于下载并使用更新的依赖项重新编译。

如果您不确定哪个程序集导致问题,那么有一个名为Fusion Log Viewer(fuslogvw.exe)的工具,它与.NET框架一起安装。使用它有点古怪,但会向您展示.NET搜索程序集的确切位置以及在程序集解析期间发生的任何错误。