未能加載文件或程序集“****”或它的某一個依賴項。試圖加載格式不正確的程序。解決方案總結


64位系統上設置編譯平台為x86的項目編譯在特定的情況下比如當一個窗體上放有包含了圖像的ImageList之后,ResGen就會產生這種問題

當這個ImageList中沒有圖像時編譯也是正常的,但是一旦編譯就會引發這樣的異常。

這個錯誤產生的原因在於,VS2010內部使用的編譯器中,無論是32位還是64位的編譯組件,都是純IL的,也就是在64位系統中是 以64位模式運行,這與當前項目使用的平台設置無關。當編譯的組件引用了一個標記為x86的庫(僅32位模式)時,編譯組件便會發生錯誤,無法加載,從而 導致編譯失敗。

這個問題發生在以下的情況中

1,在64位操作系統上使用任何版本的MSBuild編譯引用了僅32位組件的.Net 3.5的項目; 
2,使用64位MSBuild編譯引用了僅32位組件的項目; 
3,使用32位MSBuild編譯引用了僅64位組件的項目。

 要解決這個問題,可以在解決方案管理器中,將所有的庫的目標平台全部設置為 AnyCPU就可以了。

如果需要最終執行平台是X86只需將最終的執行文件目標平台設置為x86:

vs2010_target_x86_img2

這樣即可正常編譯。

程序最終運行的平台,是根據可執行文件的設置來的,因此庫中設置為AnyCPU不會影響到最終程序的運行,運行依然是在x86之下。

但是如果引用的DLL有僅32位的,那這種方法就不行了,解決辦法http://support.microsoft.com/kb/2028833,詳見MSBuild 4.0 or Visual Studio 2010 may fail to compile a 32-bit application targeted for .Net Framework 3.5, 3.0 or 2.0 on x64 machine

 詳細解決步驟如下:

    1、關閉所有Visual Studio;

    2、以管理員的身份打開VS2010的命令提示窗口;

    3、更改目錄至"<system_drive>:\Program Files (x86)\Microsoft SDKs\Windows\v<x.xx>\bin\”下面;

    4、輸入該命令corflags /32bit+ ResGen.exe /force,執行;

    5、使用記事本打開<project_name>.csproj文件;

    6、在PropertyGroup下添加<ResGenToolArchitecture>Managed32Bit</ResGenToolArchitecture>,保存,關閉退出。

  現在在VS2010中重新打開原先的項目,編譯通過,可以正確運行了!

  步驟做完后就能運行的原因是,此時ResGen就是以32位模式運行了,而不是64位,因此便可以加載標記為僅32位的程序集了。代價是——它就再也無法編譯標記為僅64位模式的程序集了。

  對於該問題,還有另一個解決辦法,打開項目屬性頁面,選擇應用程序選項卡,設置目標框架為.NET Framework 4 。(由於框架限制,這個沒測試)

  有關CorFlags.exe轉換工具的詳細信息請參見http://msdn.microsoft.com/zh-cn/library/ms164699.aspx

  有關Resgen.exe資源文件生成器的詳細信息請參見http://msdn.microsoft.com/zh-cn/library/ccec7sz1.aspx

參考園子文章 http://www.cnblogs.com/nicch/archive/2010/05/25/building_cross_platform_application_on_64bit_msbuild.html

       http://www.cnblogs.com/hans_gis/archive/2011/07/22/2114013.html

 

原文轉自:http://www.cnblogs.com/ggcc/archive/2011/11/25/2262960.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM