Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Условная компиляция (некоторые пояснения)  (Прочитано 8572 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 24-09-2010 08:52 » 

Есть веб-сайт для .NET 2.0, работа с ним идёт в VS2008.

Сайт работает с веб-сервисами, и для отладки понадобилось в Release обращаться к одной версии сервиса, а в Debug - к другой. Добавил два web-reference и написал условную компиляцию типа:
Код: (Text)
#if DEBUG
  DebugService...
#else
  ReleaseService...
#endif
и стал искать способ задать при компиляции define. В свойствах проекта ничего похожего на опции компилятора нет в принципе.

Что обнаружилось после некоторых размышлений о природе вещей и созерцания содержимого сайта.

1) Находящийся рядом с кнопкой пуск combobox, указывающий конфигурацию Release или Debug на веб-сайт не оказывает ни малейшего действия. Связано это с тем, что сам сайт в общем-то не обязательно компилируется при разработке - он может компилироваться прямо на веб-сервере, поэтому настройки VS никак не влияют на получающийся в результате бинарник и наличие pdb-файлов с отладочной информацией.

Правильное место для конфигурирования компиляции - файл web.config. В частности, там есть элемент:
Код:
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>
где true и false определяют Debug и Release конфигурацию сборки сайта.

2) Для определения #define DEBUG нужно добраться до ключей компилятора. Это делается элементом:
Код:
<compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/d:DEBUG"
  type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
Для версий .NET выше или ниже 2.0, соответственно, нужно изменить атрибут type. Для сборки сайта в .NET 1.0 - 2.0 данный элемент должен
находиться в секции файла web.config:
Код:
<configuration>
  <system.codedom>
    <compilers>
      <compiler ... />
    </compilers>
  <system.codedom>
</configuration>
Для сборки сайта в .NET 3.0 и выше данный элемент можно оставить в system.codedom или же можно поместить в секцию:
Код:
<configuration>
  <system.web>
    <compilation debug="true">
      <compilers>
        <compiler ... />
      </compilers>
    </compilation>
  </system.web>
</configuration>
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 24-09-2010 09:01 » 

может в FAQ?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-09-2010 14:33 » 

Не знаю...
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #3 : 24-09-2010 19:12 » 

А не знаете, как правильно применять константу CONFIG?
Из документации:
CONFIG - A string that corresponds to the current setting of the Active Solution Configuration box in the Configuration Manager.
 
Код:
#if CONFIG == Debug
            Console.WriteLine("debug");
#elif CONFIG == Release
            Console.WriteLine("release");
#else
            Console.WriteLine("other");
#endif
Так всегда компилируется код после первого if, вне зависимости от того, какая конфигурация выбрана.
Прикольный результат, если Debug и Release прописными написать  Быть такого не может
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 25-09-2010 06:59 » new

Уточнение к мною выше сказанному.

Поскольку определение DEBUG задаётся автоматически для Debug-сборки, его можно не задавать как параметр компилятора. Актуальным это становится лишь при Release-сборке, когда хочется скомпилировать Debug-части. Это, конечно, извращение, но в контексте моей задачи бывало Улыбаюсь

Dmitry, как я выше сказал, для проектов типа WebSite содержимое Configuration Manager либо вообще не работает, либо я не знаю, как его применить. У меня в этом combobox подчас вообще отсутствует строчка Release. Поэтому я не знаю, почему в CONFIG оказывается непонятное значение, всегда равное чему угодно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines