2009-07-02 81 views
8

是否有某種形式的C#指令的使用開發機(32位或64位),說的東西的影響時使用:C#指令指示的32位或64位建立

 
if (32-bit Vista) 
    // set a property to true 
else if (64-bit Vista) 
    // set a property to false 

但我想在Visual Studio中這樣做,因爲我有一個應用程序正在處理,需要在32/64位版本的Vista中進行測試。

是這樣的可能嗎?

回答

13

你能在運行時做到嗎?

if (IntPtr.Size == 4) 
    // 32 bit 
else if (IntPtr.Size == 8) 
    // 64 bit 
0

沒有什麼內置的,會爲你做這個。如果您願意,您可以隨時使用#define自己的符號並將其用於條件編譯。

3

您可以使用#if指令,並將其值設置爲一個編譯器開關(或項目的設置):

#if VISTA64 
    ... 
#else 
    ... 
#endif 

,並用編譯:

csc /d:VISTA64 file1.cs 

編譯的64位版本時, 。

11

使用64位有兩個條件需要注意。首先是64位的OS,其次是運行在64位的應用程序。如果你只關心應用程序本身,你可以使用以下命令:

if(IntPtr.Size == 8) 
    // Do 64-bit stuff 
else 
    // Do 32-bit 

在運行時,JIT編譯器可以優化掉虛假的條件,因爲IntPtr.Size屬性是不變的。

順便提及,以檢查是否OS是64位的,我們使用下面的

if(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") != null) 
    // OS is 64-bit; 
else 
    // OS is 32-bit 
1

打開Configuration ManagerBuild。從那裏你應該可以設置Active solution platform並創建專門針對x64,x86或任何CPU的配置。從那裏你可以擁有基於當前配置有條件編譯的代碼。

請注意,這通常是一個非常糟糕的主意,但。 .Net程序通常作爲IL而不是本地代碼分發。這個IL然後在用戶第一次嘗試運行時由每個本地機器上的JIT編譯器編譯。通過選擇默認的「任何CPU」,您可以讓JIT編譯器爲每臺機器做出決定。

這種情況的主要例外是當你有一個32位庫的依賴。在這種情況下,您不希望JIT編譯器針對x64進行編譯,因爲它可能會破壞與庫的互操作。

+0

在現實中,一種編譯「任何CPU」,而在64位模式會阻止您部署到32位模式,除非MS固定在VS2008這個bug ......但最後,我試過了,你必須指定32位。 – 2009-07-02 20:14:52

2

我不知道這是你在找什麼,但我檢查IntPtr.Size檢測32位與64位運行時間。請注意,這告訴你運行時環境,你可能正在運行WOW64

if (IntPtr.Size == 4) 
{ 
    //32 bit 
} 
else if (IntPtr.Size == 8) 
{ 
    //64 bit 
} 
else 
{ 
    //the future 
} 
2

我在我的C#代碼中使用的是IntPtr。大小,它在64位等於4對32位和8:

string framework = (IntPtr.Size == 8) ? "Framework64" : "Framework"; 
2

您可以使用預定義宏來在編譯設置屬性

#if (_WIN64) 
    const bool IS_64 = true; 
#else 
    const bool IS_64 = false; 
#endif 
2

我知道這是一個老話題,但我最近有以獲得相同的結果(即在構建時確定,而不是運行時)

我在「條件編譯符號」中創建了新的構建配置(x86調試版,x86發行版,x64調試版,x64版本)並設置了BUILD64或BUILD32。框中的每個配置的應用程序屬性。

當我需要做的事情之間架起不同(如改變從一個.dll一些出口x86的方法簽名),然後我用標準的構建指令來實現我所需要的。例如:

#if BUILD64 
// 64 Bit version 
// do stuff here 
#endif 

#if BUILD32 
// 32 Bit version 
// do different stuff here 
#endif