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 не существует способа определения констант для определения.