воскресенье, 17 июля 2011 г.

Директивы препроцессора C# – Условная компиляция кода.

Всем доброе утро, день, вечер, ночь!

Бывает встречаются случаи, когда Вам необходимо откомпилировать код так, чтобы для разных конфигураций одни участки кода компилировались, а другие – нет. Именно для этого и существуют в языке C# директивы препроцессора, которые позволяют управлять компиляцией кода. Вообще, такая “вещь” существует не только в языке C#, а почти во всех серьезных (промышленных) языках программирования. Об условиях компиляции в языке C# эта заметка и написана.

Если файлов проекта не много, то можно обойтись следующим способом:

Вначале нам надо задать все имена требуемых условий компиляции. Таким образом мы задаем имена только для того, чтобы в коде обозначить участки кода, которые должны будут компилироваться при активации требуемого определения.

Вот пример кода:
   1:  #define CompanyA
   2:  //#define CompanyB
   3:   
   4:  using System;
   5:   
   6:  namespace ConsoleApplication2
   7:  {
   8:      class Program
   9:      {
  10:          static void Main(string[] args)
  11:          {
  12:              #if CompanyA
  13:                  Console.WriteLine("this is CompanyA cofiguration");    
  14:              #endif
  15:   
  16:              #if CompanyB
  17:                  Console.WriteLine("this is CompanyB cofiguration");
  18:              #endif
  19:   
  20:              Console.Read();
  21:          }
  22:      }
  23:  }

В данном случае откомпилируется тока области, помеченные как #if CompanyA - #endif. Если необходимо откомпилировать области помеченные как #if CompanyB - #endif, необходимо закомментировать определение #define CompanyA и разкомментировать #define CompanyB.

Если необходимо применить имя условия в рамках всего проекта, то в свойствах проекта укажите имя области в текстовом поле Conditional compilation symbols (Символы условной компиляции), расположенным на вкладке Build (Сборка) страницы Properys (Свойства) проекта:

image
Кстати, при подходе через указания имени условия в свойстве проекта, в коде имена через директивы #define определять не надо.

Вот такими не сложными действиями, мы можем говорить компилятору, что компилировать надо, а что наоборот, он “видеть” не должен.


Полезные ссылки:

2 комментария:

  1. я через Mono (реализацию .NET в Linux) позапускал программы. прикольно!
    можно сделать чтобы проект, написанный на C#, скомпилился в единый файл, не требующий в Linux никаких библиотек и дополнительных файлов.
    вообщем, из того что прочёл - C# мне нравится ... хоть и чуток не православно для линуксоида =)

    ОтветитьУдалить
  2. Тоже писал один подпроект на Mono в помощь людям под Linux. Там для загрузки файлов на web-сервер через php-скрипт. По производительности вроде не медленный.
    А вот Monolight (Их реализация Silverlight-платформы .NET'а) по производительности сильно проигрывает оригиналу. Причем это видно и не вооруженным взглядом.
    P.S.: Обычно все линуксоиды на дух не переносят коммерческих компаний (особенно MS) и их продуктов. =)

    ОтветитьУдалить