Использование директив препроцессора в Visual Studio 2010 с C#

#c# #visual-studio-2010

#c# #visual-studio-2010

Вопрос:

У меня есть приложение на C #, которое я создаю с помощью Visual Studio 2010. Чтобы помочь мне с некоторыми из моих рутинных задач в приложении, я хотел установить некоторые значения, если я скомпилировал приложение в режиме отладки. Естественно, я подумал, что директивы препроцессора были бы хорошей идеей. Моя проблема в том, что я не совсем понимаю, как их использовать. На данный момент у меня есть блок кода, который выглядит следующим образом:

 #define DEBUG

... // Other code in my app

#if DEBUG
  myVariable = debugValue;
#endif
  

Моя проблема в том, что когда я компилирую свое приложение в режиме выпуска, myVariable по-прежнему получает значение debugValue . Похоже, я неправильно определяю свою переменную препроцессора или неправильно настраиваю свой компилятор. Может кто-нибудь объяснить мне, что мне нужно сделать, чтобы для myVariable устанавливалось значение debugValue только при компиляции приложения в режиме отладки?

Спасибо!

Ответ №1:

Если вы используете #define DEBUG для указания символа отладки, переключение в режим выпуска все равно предоставит символ, поскольку вы явно его определяете.

Попробуйте удалить #define DEBUG строку в файлах кода. По умолчанию VS определяет DEBUG и TRACE в режиме отладки, и TRACE в режиме выпуска, поэтому нет необходимости явно определять их.

Ответ №2:

Если вы об этом не знаете, возможно, вам захочется проверить атрибут «Conditional». Это позволяет украсить метод, а не встраивать директивы препроцессора:

 class SomeClass 
{
   public void ProductionOperation()
   {
      //Doin' production stuff
       Log(someProductionVariable);
   }

   [Conditional("DEBUG")]
   public static void Log(string message) 
   {
       //Write to a file
   }
}
  

Если вы компилируете в режиме отладки, метод log будет записывать данные в файл. Если вы компилируете в режиме выпуска, условный метод становится неработоспособным. Единственное, что здесь следует иметь в виду, это то, что условный код попадет в вашу сборку, в отличие от того, если вы выгружаете его с помощью препроцессора — это различие во время выполнения. Однако, пока вы не возражаете против этого, я обнаружил, что это делает код более чистым.

(Если вы собираетесь это сделать, вы не хотите, чтобы #defining или #undefining отладочной переменной где-либо в вашем коде).

Ответ №3:

Константа ОТЛАДКИ фактически определена в свойствах вашего проекта. Перейдите в Свойства проекта -> Вкладка Сборка -> Определить константу ОТЛАДКИ.

Явно объявляя эту константу, вы переопределяете константу, объявленную VS .

Ответ №4:

Просто чтобы немного добавить к ответам Кайла и Стива..

Если вы откроете свой файл .csproj с помощью текстового редактора, вы можете увидеть, как отладка и выпуск конфигурации определяют символы.

 <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    ...
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    ...
    <DefineConstants>TRACE</DefineConstants>
    ...
  </PropertyGroup>
  

Активная конфигурация устанавливается с помощью

 <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
  

но, как уже упоминал Кайл, ваш код по существу добавляет его ко всем конфигурациям.