今天將編譯的C#的exe拷貝到測試機上(Win7_64bit),一運行就掛了,提示“stop working”,一開始懷疑測試機上沒有安裝.net framework框架,追究半天原來是編譯的目標平台選擇錯誤。
解決方法:
Project Property-》Build-》Platform. target,將默認的any cpu選擇為x86,重新編譯程序后再拷貝到測試機上運行就沒有問題了。
追究原因:
首先看看這個目標平台有哪些選項,有什么區別吧。
在VisualStudio中,在編譯設置中有如下選項:
x86: 將程序集編譯為由兼容x86的32位公共語言運行庫運行。
x64: 將程序集編譯為由支持AMD64或EM64T指令集的計算機上的64位公共語言運行庫運行。
anycpu:(默認值)將程序集編譯為在任意平台上運行。
Itanium: 將程序集編譯為由采用Itanium處理器的計算機上的64位公共語言運行庫運行。
具體行為如下:
用x86編譯的程序集將在WOW64下運行的32位CLR上執行。
用x64編譯的程序集將在64位CLR上執行。
用anycpu編譯的可執行文件將在64位CLR上執行。
用anycpu編譯的DLL將在與加載它的進程相同的CLR上執行。
在32位Windows操作系統上:
用x86或anycpu編譯的程序集將在32位CLR上執行。
用x64編譯的程序集無法運行。
按照上面的解釋,我的程序選擇目標平台為any cpu,應該也可以在64位系統上運行啊,為什么運行不起來呢,原來是程序有調用其他的dll,而這些dll都是32位的,我的程序在64位系統上會以64位程序執行,但是不能調用32位的dll,所以就出錯啦。
以下內容為轉載哦,感覺作者講的很清楚很透徹。
X86與X64:
腦硬件CPU可以分為x86與x64, x86的機器只能安裝32位的操作系統,如XP, WIN7_86, x64的機器既可以安裝32位的系統,又可以安裝64位的系統,只是在x64的機器上安裝32位的系統,不能夠很充分的利用這台機器的資源。x86程序,即適用於32為操作系統的程序,x64即適用於64位操作系統的程序。64位系統上依然可以運行32位的程序,但是這是通過WOW64來運行,通俗上講,就是模擬出一個32位的CPU來運行這個程序。
C#程序的編譯運行:
C#程序的編譯運行,分為兩步,第一步是編譯成IL,在編寫C#程序的時候,需要考慮到在最終程序需要在哪種環境下運行。Build中默認的環境是Any CPU,還有X86,X64.這些有什么不同?根據名字,我們可能認為,編譯器會根據選擇的環境不同來生成不同的二進制文件。然而,C#編譯器只是把代碼編譯成為了IL代碼,以dll的形式。然后再程序運行的時候,JIT編譯器才把IL代碼編譯為CPU能夠識別的二進制碼。所以,無論選擇哪個環境,都不會影響dll的生成,只是在dll的頭文件中加入了一些平台信息,最終運行的時候JIT會根據這些信息來編譯dll給CPU處理。
舉例:
A項目是Console Application, B項目是Class Library,在64位操作系統的機器上。A項目為Start Project,決定了這個程序的32位還是64位的屬性。如果A設置為x86, A決定了這個程序為32位,B設置為x86,因為兩個項目都是同一類型,雖然都是32位,但可以在64位系統上運行。如果A為Any CPU, B為x86,就會出問題。因為A雖然為Any CPU,但是在64位操作系統上運行,就會轉換成64位的dll,A決定了這個程序為64位,然后再調用32位的dll,就會出問題。如果A為x86, B為Any CPU,就不會出問題。因為A決定了這個程序為32位,調用B的時候就會把B轉成32位,一切正常。
問題一:可以一直把Project設置為Any CPU嗎?
因為現在很多的系統都是64位的,所以我們的程序設置成Any CPU,在64位機器上跑的時候就是64位的程序,但是這些程序很多時候需要使用一些組件,比如COM組件等,而這些組件僅僅是32位的dll,根本不支持64位,當我們用64位的程序調用這些dll的時候就會有問題。所以,這時候,我們就需要把我們的程序設置成x86。
問題二:可以一直把Project設置為X86嗎?
那么現在我們就要保證我們的程序引用的dll都是32位的。雖然很多第三方的dll都提供32位與64位兩個版本,基本上可以保證這一點。但是如果沒有必要做成32位的程序,單純是為了方便,我們前邊說過64位的系統運行32位的程序,效率不高,浪費了我們的資源。