Директива C# для указания на 32-разрядную или 64-разрядную сборку

Помимо возможных проблем безопасности, если Вы выполняете отправленный пользователями код, большую часть времени существует лучший путь, который не включает перепарсинг кода каждый раз, когда это выполняется. Анонимные функции или свойства объектов могут заменить большую часть использования оценки и намного более безопасны и быстрее.

8
задан Tim Cooper 24 September 2011 в 14:51
поделиться

7 ответов

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

if (IntPtr.Size == 4)
  // 32 bit
else if (IntPtr.Size == 8)
  // 64 bit
13
ответ дан 3 November 2019 в 12:50
поделиться

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

string framework = (IntPtr.Size == 8) ? "Framework64" : "Framework";
2
ответ дан 3 November 2019 в 12:50
поделиться

Вы можете использовать директиву #if и установить значение как переключатель компилятора (или в настройках проекта):

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

и скомпилировать с:

 csc /d:VISTA64 file1.cs 

когда компиляция 64-битной сборки.

3
ответ дан 3 November 2019 в 12:50
поделиться

При использовании 64-разрядной версии необходимо учитывать два условия. Во-первых, это 64-битная ОС , а во-вторых, приложение , работающее в 64-битном режиме. Если вас беспокоит только само приложение, вы можете использовать следующее:

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

Во время выполнения JIT-компилятор может оптимизировать ложное условие, потому что свойство IntPtr.Size является постоянным.

Между прочим, чтобы проверить, ОС 64-разрядная, мы используем следующую

if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) != null )
    // OS is 64-bit;
else
    // OS is 32-bit
11
ответ дан 3 November 2019 в 12:50
поделиться

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

0
ответ дан 3 November 2019 в 12:50
поделиться

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

if (IntPtr.Size == 4)
{
    //32 bit
}
else if (IntPtr.Size == 8)
{
    //64 bit
}
else
{
    //the future
}
2
ответ дан 3 November 2019 в 12:50
поделиться

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

Обратите внимание, что это обычно очень плохая идея. .Net-программы обычно распространяются как IL, а не как машинный код. Затем этот IL компилируется JIT-компилятором на каждой локальной машине при первой попытке пользователя запустить его. Оставляя выбранным по умолчанию «Любой ЦП», вы позволяете JIT-компилятору делать это определение для каждой отдельной машины.

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

вы позволяете JIT-компилятору делать это определение для каждой отдельной машины.

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

вы позволяете JIT-компилятору делать это определение для каждой отдельной машины.

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

1
ответ дан 3 November 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: