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:
這樣即可正常編譯。
程序最終運行的平台,是根據可執行文件的設置來的,因此庫中設置為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/hans_gis/archive/2011/07/22/2114013.html
原文轉自:http://www.cnblogs.com/ggcc/archive/2011/11/25/2262960.html