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

时间:2012-12-21 15:22:12

标签: .net-4.0 .net-4.5

根据MSDN documentation

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 ran in a 32-bit mode中处理的原因。当我创建WPF .NET 4.5项目时,此设置为 true 。然后,当我切换到.NET 4.0时,它变得不活动,因为在.NET 4.0中没有这样的选项。当我切换回.NET 4.5时,它变成了 false ,我想这是出于兼容性目的。

1 个答案:

答案 0 :(得分:2)

让我们快速从表中清除一个假设,没有可能的方法在安装了.NET 4.5的机器上有不同的行为。定位4.0在运行时没有任何区别。唯一能做的就是选择一组不同的引用程序集,它们可以防止你意外地使用.NET 4.5上可用的类而不是.NET 4.0上的类。

无法在同一台计算机上安装4.0和4.5。 .NET 4.5不是.NET框架的并行版本,如3.5和4.0并排。安装4.5 替换已安装的4.0版本。 CLR,抖动,所有运行时程序集以及C#编译器。

这里最好关注EXE项目的平台目标设置,即选择流程位数的设置。您可以犯的错误是忘记了Debug与Release版本的设置可能不同。并假设Build + Configuration Manager中的“Active solution platform”组合框具有任何效果。它没有,只有Project + Properties,Build选项卡,Platform目标设置很重要。这是许多程序员陷入困境的非常尴尬的陷阱。