Assembly.LoadFrom BadImageFormatException - .NET 4.0 和 4.5 中的不同行為(可能未記錄)
根據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 中的“活動解決方案平台”組合框有任何效果。它沒有,只有項目 + 屬性、建構選項卡、平台目標設置很重要。這是很多程序員都陷入的一個非常尷尬的陷阱。