Могу ли я использовать препроцессор C #, чтобы пропустить код Kinect v2.0?

Быстрый вопрос: я разрабатываю небольшую программу, с которой хотел бы работать с Kinect версий 1 и 2. Есть ли команда препроцессора, которую я могу использовать, чтобы компилятор C # пропустил мой код Kinect v2.0, если у меня нет установлен ли Kinect 2.0 sdk? (Например, когда я работаю с Windows 7).


person Wiredchop    schedule 21.09.2015    source источник


Ответы (1)


В основном так:

#if KINECT1
   // ... kinect1 specifict code
#endif

#if KINECT2
   // ... kinect2 specific code
#endif

Конечно, вам придется определить эти символы вручную, в компиляторе или фреймворке нет встроенной возможности определить, какая версия есть в наличии, если вообще есть.

Вы можете обнаружить любую установленную Kinect SDK (версию) с помощью MSBuild. Например, поищите определенные разделы реестра, пути на локальных дисках и / или установите переменные среды, а затем установите эти символы из файлов проекта.

Например, включите следующий фрагмент в верхнюю часть вашего .csproj файла (или поместите его в отдельный файл, который вы <Import>).

 <PropertyGroup Condition="Exists('C:\Program Files\...\Whatever\v1.0')">
     <DefineConstants>KINECT1;$(DefineConstants)</DefineConstants>
 </PropertyGroup>
 <PropertyGroup Condition="Exists('C:\Program Files\...\Whatever\v2.0')">
     <DefineConstants>KINECT2;$(DefineConstants)</DefineConstants>
 </PropertyGroup>

(Имейте в виду, что это всего лишь пример, но не знаю, что было бы хорошим «триггером» для определения версии для kinect).

ОБНОВЛЕНИЕ

Комментарий @Scott Chamberlain помог. На самом деле SDK Kinect 1.0 устанавливает переменную среды KINECTSDK10_DIR, а SDK 2.0 устанавливает переменную среды KINECTSDK20_DIR.

Итак, вы можете сделать что-то вроде этого (это может помочь также):

 <PropertyGroup Condition="'$(KINECTSDK10_DIR)' != '' and Exists('$(KINECTSDK10_DIR)')">
     <DefineConstants>KINECT1;$(DefineConstants)</DefineConstants>
 </PropertyGroup>
 <PropertyGroup Condition="'$(KINECTSDK20_DIR)' != '' and Exists('$(KINECTSDK20_DIR)')">
     <DefineConstants>KINECT2;$(DefineConstants)</DefineConstants>
 </PropertyGroup>
person Christian.K    schedule 21.09.2015
comment
В качестве напоминания для людей, реализующих решение MSBuild: SDK действительно создает переменную среды KINECTSDK_DIR (см. Раздел «Изменения в этом выпуске» в readme), путь похож на C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2, что должно позволить вам проанализировать версию. - person Scott Chamberlain; 21.09.2015
comment
Ой, классно устанавливает KINECTSDK20_DIR. Я не могу установить SDK на машину, на которой я был, поэтому я не мог проверить. - person Scott Chamberlain; 21.09.2015
comment
Спасибо за это, ребята, мне удалось заставить это работать, хотя пара примечаний, это НЕ БУДЕТ работать для меня, если я не добавлю определения группы свойств ниже всех существующих групп свойств и выше первой группы элементов . Я не уверен, может ли это быть связано с тем, что стандартный файл csproj очищает существующие константы, когда он определяет DEBUG, TRACE и т. Д. - person Wiredchop; 22.09.2015