Директива 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.

возможно ли что-то подобное?

9 ответов


можете ли вы сделать это во время выполнения?

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 может оптимизировать ложное условие, потому что IntPtr.Свойство Size является постоянным.

кстати, чтобы проверить, если OS 64-бит мы используем после

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

можно использовать


то, что я использую в своем коде C#, - IntPtr.Размер, он равен 4 на 32bit и 8 на 64bit:

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

вы можете использовать предопределенные макросы для установки свойств компиляции

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

Я не уверен, что это то, что вы ищете, но я проверяю IntPtr.Size для обнаружения 32-битной и 64-битной среды выполнения. Обратите внимание, что это говорит вам о среде выполнения, вы можете работать в WOW64

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

Я знаю, что это старая тема, но недавно мне пришлось достичь того же результата (т. е. определить время сборки, а не время выполнения)

Я создал новые конфигурации сборки (x86 debug, x86 release, x64 debug, x64 release) и установил BUILD64 или BUILD32 в поле "условные символы компиляции" в свойствах приложения для каждой конфигурации.

когда мне нужно было сделать что-то другое между сборками (например, изменить подпись на некоторых x86 экспортированных методах из .dll), затем я использовал стандартные директивы сборки для достижения того, что мне нужно. например:

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

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

открыть Configuration Manager с Build. Оттуда вы сможете установить Active solution platform и создайте конфигурацию, которая специально предназначена для x64, x86 или любого процессора. Оттуда вы можете иметь код, который условно компилируется на основе текущей конфигурации.

обратите внимание, что это обычно очень плохая идея. Программы .Net обычно распространяются как IL, а не собственный код. Этот IL затем компилируется компилятором JIT на каждой локальной машине в первый раз, когда пользователь пытается запустить его. Оставив значение по умолчанию "любой процессор", вы позволяете компилятору JIT сделать это определение для каждой отдельной машины.

основное исключение для этого - когда у вас есть зависимость от 32-битной библиотеки. В этом случае вы не хотите, чтобы компилятор JIT когда-либо компилировался для x64, потому что он может нарушить ваше взаимодействие с библиотекой.


нет ничего встроенного, что сделает это за вас. Вы всегда можете #define ваш собственный символ и используйте его для условной компиляции, если хотите.