XNA - условно включить объект на основе целевой платформы

Я создаю приложение XNA 4.0 для Windows и Xbox.

В версии Windows у меня есть консоль отладки, которая ссылается на IronPython и некоторые сборки CLR/DLR, которые не поддерживаются в компактной среде. У меня также есть несколько частичных классов, которые ссылаются на эти предметы.

Я знаю, что могу удалить ссылки из проекта xbox для обеспечения совместимости. Однако мне также необходимо удалить классы, которые ссылаются на эти элементы. Проблема заключается в том, что эти классы создаются другими классами, которые в них нуждаются, но только для Windows.

Очевидное решение этой проблемы - просто обернуть вызовы неподдерживаемых классов в #if директивы препроцессора:

#if WINDOWS
  InitializeScriptingEngine(....);
#endif

Кроме того, я полагаю, что я мог бы обернуть весь класс / частичный класс таким же образом, чтобы предотвратить его компиляцию. Есть лучший способ сделать это? Я бы хотел избежать перетекания кода директивами препроцессора.

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

1 ответ

Решение

Если вы используете встроенную функциональность Game Studio для "Создать копию проекта для Xbox 360" (то же самое для Zune и Windows Phone), то между проектами будут отражаться следующие операции:

  • Добавить новый предмет
  • Добавить существующий элемент
  • переименовывать
  • удалять

Важно отметить, что следующие операции не отражаются между проектами:

  • Исключить из проекта
  • Изменение ссылок и ссылок на контент

Это объясняется (с гораздо большим количеством подробностей) на странице Конвертер кроссплатформенного игрового проекта в MSDN. Этот процесс контролируется <XnaCrossPlatformGroupID> элемент в файлах проекта.

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

Лично я предпочитаю вместо рассеяния #ifdef на протяжении всего моего проекта создавать альтернативные классы-заглушки в тех случаях, когда платформе не хватает какой-либо функциональности. И если вы приложите [Conditional("NEVER_DEFINED")] приписывайте свои функции-заглушки, тогда компилятор удалит вызовы к ним.

Я достаточно уверен, что в Visual Studio не существует способа определения констант для определения.

Другие вопросы по тегам