.NET 4.0和4.5中Assembly.LoadFrom的BadImageFormatException行为不同(可能未记录)

8
根据 MSDN 文档
public static Assembly LoadFrom(string assemblyFile)

如果出现BadImageFormatException,则抛出异常。

assemblyFile is not a valid assembly.
-or-
Version 2.0 or later of the common language runtime is currently loaded 
and assemblyFile was compiled with a later version.

实际上,还有一个额外的情况——从在x64模式下运行的程序集加载为x86构建的程序集。也许这已经包含在“无效的程序集”语句中了,我不知道。但这是异常的合理原因。
好吧,在.NET 4.5中不会出现这种情况!我有一个.NET 4.5 WPF应用程序,可以加载不同的应用程序,出于某种原因。它正在构建为任何CPU,并在x64 Win 7上启动。我一直在测试一个可执行文件,它是为.NET 4.0 x86构建的,而且工作得很好。但是当我把我的应用程序切换到.NET 4.0时,它就开始在Assembly.Load方法上崩溃!
所以,我的问题是,我错过了什么吗?如果没有,那么他们是如何做到的——在.NET 4.5中从x64进程加载x86程序集?我在这一点上缺乏一些理解。
更新

感谢Hans Passant,我已经找到了我的错误。实际上,Assembly.Load的行为没有任何不同。原来我没有注意到项目设置中的Prefer 32-bit选项(或.csproj文件中的Prefer32Bit标记)。这就是为什么我的.NET 4.5进程以32位模式运行的原因。当我创建WPF .NET 4.5项目时,此设置为true。然后,当我切换到.NET 4.0时,它变得无效,因为.NET 4.0中没有这样的选项。当我再次切换回.NET 4.5时,它变成了false,我猜是为了兼容性目的。


当我将我的应用程序切换到.NET 4.0时,你是不是指的.NET 4.5? ;) - HericDenis
不,它最初是为4.5构建的,但后来我们意识到需要它在4.0上工作。 - EvAlex
如果这是一个运行时问题,它并不特别与那些版本的编译器有关。未标记。 - leppie
没有足够的信息来回答你的问题,但我保证你的结论很可能是错误的。 - Security Hound
1个回答

2
让我们先澄清一个假设,已经安装了.NET 4.5的计算机不可能有不同的行为。在运行时,定位到4.0并没有什么区别。唯一的作用是选择不同的引用程序集,以防止您意外使用在.NET 4.5上可用但在.NET 4.0上不可用的类。
同一台计算机上不可能同时安装4.0和4.5。.NET 4.5不像3.5和4.0一样是.NET Framework的并存版本。安装4.5会替换已安装的4.0版本,包括CLR、Jitter、所有运行时程序集以及C#编译器。
最好关注EXE项目的平台目标设置,这是选择进程位数的设置。可能犯的错误是忘记该设置在调试和发布构建中可能不同,并且假设“生成+配置管理器”中的“活动解决方案平台”组合框会产生任何影响。事实并非如此,只有“项目+属性”中的“生成”选项卡的“平台目标”设置才重要。这是许多程序员掉入的非常棘手的陷阱。

1
谢谢您详细的回答!实际上,我知道如何正确设置项目的目标平台。但是您的答案帮助我找到了问题的原因。所以现在我正在更新我的问题,并将您的答案标记为正确答案。我在这里做得对吗? - EvAlex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接