2012-04-02 68 views
1

我们为一个为.NET 3.5构建的软件创建了一个插件。在这个插件中,我们引用了适用于.NET 3.5的第三方.DLL。主要的软件现在已经构建到.NET 4.0和第三方.DLL已经被分成两个.DLL。程序集解析

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

问题EDITED

有什么办法继续建立以.NET 3.5引用3.5 DLL,然后在运行时执行一些装配决心加载两个.NET 4.0的DLL的地方原来的一个?

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

+1

您是否真的尝试过这种方法?还是只是猜测可能存在问题?如果你这样做了,那么*正确*是错误信息? – 2012-04-02 17:26:00

+0

当我尝试使用旧版本的软件加载4.0插件时,出现以下错误: 无法加载程序集。错误详细信息:System.BadImageFormatException:不能 加载文件或程序集file:/// C:\ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll'或它的一个依赖关系。该程序集由比当前加载的运行时更新的 运行时构建,无法加载。 在System.Reflection文件名:'file:/// C:\ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll' 。 – 2012-04-02 17:51:06

回答

1

该组件由运行时比当前加载的运行库

新那晶莹剔透建,你的EXE加载CLR的早期版本。只有CLR的.NET 4版本知道如何加载为目标4构建的程序集。元数据格式已在4中更改,旧的CLR不知道如何读取它。

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

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

一些测试,.NET 4的高度兼容的,但它也有一些bug修复,你可能会意外地依靠。

+0

这不是我们的可执行文件,可执行文件正在尝试加载我们的DLL。可执行文件使用4.0构建,而以前的可执行文件使用3.5构建。我们正试图让我们的DLL与两者兼容。 4.0可执行文件会加载一个3.5 DLL,但是我们的3.5 DLL需要引用该版本的第三方4.0参考,以及早期版本的3.5 DLL。 – 2012-04-02 19:06:13

+0

只有EXE才能确定将加载哪个版本的CLR。因为它首先开始。如果你得到这个异常,那么你可以确定它是导致问题的EXE。并且它的目标是构建目标3.5获取任何4.0 DLL的唯一方法是强制EXE加载CLR版本4.这要求将其构建为目标4或此.exe.config文件。您可能需要与EXE的所有者进行交流以解决问题,他们可能不一定会为此感到高兴。 – 2012-04-02 19:28:30

0

如果结构完全相同(同时支持1个程序集),则在.NET 4运行库中加载.NET 3.5库时不存在问题。 (我在IronScheme中做了很多,因为我懒得在VS2010上构建)。

+0

不知道我是否清楚,我编辑了这个问题。谢谢。 – 2012-04-02 17:25:24