VS2008: множественные конфигурации сборки с определениями не работают должным образом - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть базовая библиотека для поддержки в нескольких версиях.Я делаю SVN-переключение всякий раз, когда мне нужно работать с другой версией.

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

В настоящее время у меня есть следующие конфигурации сборки в решении тестового приложения: Debug, Release, DebugV10, ReleaseV10, DebugV15, ReleaseV15.В конфигах * V10 и * V15 я создал и выбрал соответствующие конфигурации * V10 и * V15 PROJECT для двух проектов, имеющих тестовый код для конкретной версии (не для всех проектов, большинство запускают обычную конфигурацию Debug / Release в решении -VxКонфигурация).

В этих конфигурациях проекта я ввел соответствующие условные символы компиляции (VERSION10 и VERSION15).

Теперь в моем коде в проекте я иду как

#if VERSION10
  // do v1.0 stuff
#elif VERSION15
  // do v1.5 stuff
#else
  // do trunk stuff
#endif

Но, видимо, VS не распознает символы.Даже простой #if DEBUG больше не работает, все, что определяет постоянную DERBUG, проверяется во всех конфигурациях проекта Debug *.

Это известная вещь?Что я могу с этим поделать?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

Понятие, которое вы описываете, звучит хорошо.

То есть код использует:

#if VERSION10 ... #endif

, а конфигурация проекта определяет VERSION10

и решениеконфигурация настроена на использование вышеуказанной конфигурации проекта.

Пока все они настроены правильно, я ожидаю, что она будет работать.

Тот факт, что вы говорите, даже# если DEBUG не работает должным образом, это говорит о том, что что-то очень сломано.

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

#if VERSION1
  Console.WriteLine("Hello from version 1");
#else
  Console.WriteLine("Hello from version 2");
#endif

Затем создайте конфигурации проекта (« Отладка версии 1 »,« Отладка версии 2 ») и посмотрите, сможете ли вы их настроить.(один с определенной версией VERSION1, один без), чтобы получить два выходных сигнала при сборке.

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

После того, как вы это сделаете, у вас должна быть работающая система (понимание того, как эти элементы связаны друг с другом), которую вы сможете применить к своему более сложному проекту.Чтобы применить их обратно, я предлагаю удалить большинство конфигураций проекта / решения, а затем перестроить их с нуля, теперь, когда вы уверены, что знаете, что делать, - часто перестройка этих вещей из первых принципов работает лучше, чем попытка настроить существующий «сломанный»«вернуться к жизни.

0 голосов
/ 17 ноября 2010

Условная компиляция в C # отличается от C и C ++. См. здесь для получения информации о ConditionalAttribute классе.

Например:

doDebugOutput();    // unconditionally call the optional code

Conditional["DEBUG"]
void DoDebugOutput()
{
  // do expensive debug-only output here
}
...