【问题标题】:Assembly Resolve大会决议
【发布时间】:2012-04-02 17:08:55
【问题描述】:

我们为专为 .NET 3.5 构建的软件创建了一个插件。在这个插件中,我们引用了适用于 .NET 3.5 的第三方 .DLL。主软件现在构建为 .NET 4.0,第三方 .DLL 已拆分为两个 .DLL。

我们想要避免的是使用几乎完全相同的代码使用两种不同的解决方案(一种基于 .NET 4.0 构建并引用 4.0 DLL,另一种基于 3.5 构建并引用 3.5 DLL)。并非我们所有的客户都会立即升级到我们为其创建插件的软件的最新版本,有些客户可能会等待数年。

问题已编辑

有没有办法继续构建到 .Net 3.5 引用 3.5 DLL,然后在运行时执行一些程序集解析以加载两个 .Net 4.0 DLL 来代替原始的?

我们希望/需要继续构建 3.5 框架,以便以前版本的主要软件将继续加载我们的插件。如果我们构建到 4.0,那么旧版本在尝试加载我们的插件时会出错,因为它构建到更高版本的框架。

【问题讨论】:

  • 您是否真的尝试过,或者您只是猜测可能有问题?如果你这样做了,那么究竟是什么错误消息?
  • 当我尝试使用旧版本的软件加载 4.0 插件时,我收到以下错误:无法加载程序集。错误详细信息:System.BadImageFormatException:无法加载文件或程序集 'file:///C:\Users*******\Documents\Visual Studio 2010\Projects\RandomProjects\A2013Testing\bin\Debug\A2013Testing.dll ' 或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。文件名:'file:///C:\Users*******\Documents\Visual Studio 2010\Projects\RandomProjects\A2013Testing\bin\Debug\A2013Testing.dll' at System.Reflection..

标签: .net dll assemblies


【解决方案1】:

此程序集由比当前加载的运行时更新的运行时构建

很清楚,您的 EXE 加载了早期版本的 CLR。只有 .NET 4 版本的 CLR 知道如何加载为目标 4 构建的程序集。元数据格式在 4 中发生了变化,旧的 CLR 不知道如何读取它。

要么将你的 EXE 重新构建为目标 4,要么提供一个 app.exe.config 文件来强制你的程序使用较新版本的 CLR 运行。它应该是这样的:

<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" />
    </startup>
</configuration>

需要进行一些测试,.NET 4 高度兼容,但它确实修复了一些您可能不小心依赖的错误。

【讨论】:

  • 这不是我们的可执行文件,可执行文件正在尝试加载我们的 DLL。可执行文件是用 4.0 构建的,以前的可执行文件是用 3.5 构建的。我们正在尝试使我们的 DLL 与两者兼容。 4.0 的可执行文件会加载一个 3.5 的 DLL 就好了,但是我们的 3.5 DLL 需要为此版本引用第三方 4.0 引用,而早期版本需要引用 3.5 DLL。
  • 只有 EXE 决定将加载哪个版本的 CLR。因为它首先开始。如果你得到这个异常,那么你可以确定它是导致问题的 EXE。并且它是针对 3.5 构建的 加载任何 4.0 DLL 的唯一方法是强制 EXE 加载 CLR 版本 4。这要求它要么构建为目标 4,要么构建到这个 .exe.config 文件。您可能需要与 EXE 的所有者交谈以解决此问题,他们可能不一定对此感到高兴。
【解决方案2】:

如果结构完全相同(iow 1 个程序集),则在 .NET 4 运行时加载 .NET 3.5 库没有问题。 (我在 IronScheme 中经常这样做,因为我懒得在 VS2010 上构建)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 2015-10-02
    • 2018-11-30
    • 2014-04-06
    相关资源
    最近更新 更多