Dot-Net-4.0

Assembly.LoadFrom BadImageFormatException - .NET 4.0 和 4.5 中的不同行為(可能未記錄)

  • December 24, 2012

根據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 項目​​時,此設置為真。然後,當我切換到 .NET 4.0 時,它變得不活躍,因為 .NET 4.0 中沒有這樣的選項。當我切換回 .NET 4.5 時,它變成了false,我猜是出於兼容性目的。

讓我們快速清除一個假設,在安裝了 .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 中的“活動解決方案平台”組合框有任何效果。它沒有,只有項目 + 屬性、建構選項卡、平台目標設置很重要。這是很多程序員都陷入的一個非常尷尬的陷阱。

引用自:https://stackoverflow.com/questions/13992696