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

EvA*_*lex 8 .net-4.0 .net-4.5

根据MSDN文档,

public static Assembly LoadFrom(string assemblyFile)
Run Code Online (Sandbox Code Playgroud)

抛出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.
Run Code Online (Sandbox Code Playgroud)

实际上,有一个额外的案例 - 从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时,它变得错误,我想,这是出于兼容性的目的.

Han*_*ant 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 项目的平台目标设置,即选择进程位数的平台目标设置。您可能犯的错误是忘记调试与发布版本的设置可能不同。并假设“构建+配置管理器”中的“活动解决方案平台”组合框有任何作用。事实并非如此,只有项目+属性、构建选项卡、平台目标设置很重要。这是一个非常尴尬的陷阱,很多程序员都陷入过。