【问题标题】:Dynamically loaded assembly reference issues动态加载的程序集参考问题
【发布时间】:2011-11-04 20:38:27
【问题描述】:

我有一个程序集A,此程序集动态加载程序集BCE。以后还会加载更多。

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

  1. 动态加载程序集时如何引用FG B,假设FGB 在同一个文件夹中?
  2. 动态加载程序集时如何引用FG B,假设 FG 在不同的文件夹中?

问题二:
这很大程度上是因为在尝试快速测试某些功能时,我将引用的程序集从 B 的二进制文件夹复制到 A 的,这导致了以下异常:

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

我认为这是因为我使用的 log4net 版本与 B 的依赖项之一不同。
问题:强>
我可以采取什么措施来避免此类版本控制问题?
修复问题一会解决这个问题吗?如果不是,为什么?


我应该为此使用 Autofac 吗?
它会帮助我吗?如何?

请记住,Assembly A 的想法是采用“插件”,并且按照该顺序,不能以声明方式指向 Assemblies 或其依赖项

【问题讨论】:

  • 您是否能够解决您的第一个问题?选择的答案似乎只针对第二个..

标签: c# dll dynamic assembly-resolution


【解决方案1】:

只要程序集的版本兼容,您就可以指示 CLR 加载特定版本,而不管您所依赖的程序集是针对哪个版本编译的。

例如,将此 sn-p 添加到您的配置文件将重定向 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 在哪里搜索程序集以及在程序集解析期间发生的任何错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2011-02-23
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多