XNA - условно включить объект на основе целевой платформы - PullRequest
1 голос
/ 12 ноября 2010

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 13 ноября 2010

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

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

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

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

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

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

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

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

...