簡體   English   中英

C#指令指示32位或64位構建

[英]C# Directive to indicate 32-bit or 64-bit build

是否有某種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中進行測試。

這樣的事情可能嗎?

你能在運行時做到嗎?

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

64位有兩個需要注意的條件。 第一個是OS 64位,第二個是64位運行的應用程序 如果您只關心應用程序本身,可以使用以下內容:

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

在運行時,JIT編譯器可以優化false條件,因為IntPtr.Size屬性是常量。

順便提一下,要檢查操作系統是否為64位,我們使用以下內容

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

您可以使用#if指令並將值設置為編譯器開關(或在項目設置中):

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

並編譯:

 csc /d:VISTA64 file1.cs 

編譯64位版本時。

我不確定這是否是您正在尋找的但我檢查IntPtr.Size以檢測32位與64位運行時。 請注意,這可以告訴您運行時環境,您可能正在WOW64中運行

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

我在C#代碼中使用的是IntPtr.Size,它在32位上等於4,在64位上等於8:

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

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

我創建了新的構建配置(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

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

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

Build打開Configuration Manager 從那里,您應該能夠設置Active solution platform並創建專門針對x64,x86或任何CPU的配置。 從那里,您可以根據當前配置有條件地編譯代碼。

請注意,這通常是一個非常糟糕的主意。 .Net程序通常以IL而不是本機代碼的形式分發。 然后,當用戶第一次嘗試運行它時,JIT編譯器會在每台本地計算機上編譯此IL。 通過選擇默認的“任何CPU”,允許JIT編譯器為每台機器進行確定。

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

內置任何內容都無法為您完成此任務。 您可以隨時#define您自己的符號,並根據需要將其用於條件編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM