[轉]C#程序無法在64位系統上運行之.NET編譯的目標平台


今天將編譯的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位公共語言運行庫運行。

具體行為如下:

在64位Windows操作系統上:

用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位的程序,效率不高,浪費了我們的資源。


免責聲明!

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



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