未能載入檔案或程式集“****”或它的某一個依賴項。試圖載入格式不正確的程式。解決方案總結
當這個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之下。
詳細解決步驟如下:
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 。(由於框架限制,這個沒測試)