2015-01-28 3 views
3

В C++ есть предопределенные макросы:Как использовать #if, чтобы решить, какую платформу компилируются для в C#

#if defined(_M_X64) || defined(__amd64__) 
    // Building for 64bit target 
    const unsigned long MaxGulpSize = 1048576 * 128;// megabyte = 1048576; 
    const unsigned long MaxRecsCopy = 1048576 * 16; 
#else 
    const unsigned long MaxGulpSize = 1048576 * 8;// megabyte = 1048576; 
    const unsigned long MaxRecsCopy = 1048576; 
#endif 

Который позволяет мне установить константы контролировать объем памяти, который будет использоваться.

Конечно, я могу определить переменную препроцессора буквально следующее:

#define Is64bit 1 

using System; 
using System.Collections.Generic; 

-later-

#if Is64bit 
    // Building for 64bit target 
    const long MaxGulpSize = 1048576 * 128;// megabyte = 1048576; 
    const long MaxRecsCopy = 1048576 * 16; 
#else 
    const long MaxGulpSize = 1048576 * 8;// megabyte = 1048576; 
    const long MaxRecsCopy = 1048576; 
#endif 

Я не могу найти способ, чтобы обнаружить платформу на основе значений, установленных в менеджере конфигурации, который позволит построить здание командной строки:

set de=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe 
set sol=E:\Some\Path\to\my.sln 
"%de%" %sol% /build "Release|x86" 
"%de%" %sol% /build "Release|x64" 

Есть ли способ обнаружить th есть или мне придется строить, менять платформу и строить снова?

+1

Считаете ли вы использование условных символов компиляции? Они могут быть установлены в вашем проекте в зависимости от целевой платформы. –

+0

Спасибо @QualityCatalyst, они будут автоматическими или мне нужно их установить? Есть ли список условных символов? –

+1

Вам нужно будет установить их в конфиге. Конфигурация довольно открыта и не заботится о том, что вы определяете. – maxwellb

ответ

8

Вы можете добавить любые константы в файл .csproj. Они могут быть помещены в условные группы свойств, как показано ниже.

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> 
    <DefineConstants>TRACE;X64</DefineConstants> 
    ... 
</PropertyGroup> 

Для моего выпуска x64 сборки, я определил постоянный X64, что я могу использовать, как это:

#if X64 

#endif 
+0

Это звучит так, как я. Спасибо, Джон. –

1

Убедитесь, что ваш дизайн учитывает, следует ли это знать во время компиляции или во время выполнения. Если это время компиляции, то да, вам, вероятно, потребуется определить константу. Это можно передать в командной строке или при использовании Visual Studio или MSBUILD через конфигурацию. Измените конфигурацию и создайте снова.

Если это время выполнения, выполните поиск ответов на такие вопросы, как How to know a process is 32-bit or 64-bit programmatically ... и друзей.

Однако также возможно, что это различие может не иметь значения, в зависимости от потребностей вашего приложения. .NET управляет своей собственной памятью, и ничто не останавливает сборку встроенного x86 для работы на 64-битной машине. Если вы взаимодействуете с неуправляемым кодом, есть ли какие-либо внешние из вашей библиотеки, которые могут рассказать вам, какие размеры вы должны использовать, вместо того, чтобы предполагать?

+0

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

1

Вы также можете просто определить символ (например, _x64) в свойствах проекта для x64. Откройте диалоговое окно свойств вашего проекта, выберите платформу x64 на странице сборки, просто поставьте «_x64» в поле «Символы условной компиляции».
Обязательно выполните настройку как для отладки, так и для выпуска.