четверг, 18 апреля 2013 г.

Visual Studio project AfterBuilt event

Если вдруг вы используете два .exe приложения в решении Visual Studio где один проект ссылается на другой (т.е. использует его открытые классы) то может возникнуть проблема с компиляцией конфигурационного файла того проекта на который вы ссылаетесь.
Например:
Есть проект Master, расположен в С:\MasterAndSlave\Master
Есть проект Slave, расположен в C:\MasterAndSlave\Slave

Оба они расположены в одном решении MasterAndSlave при этом Master ссылается на Slave

У проекта Slave есть конфигурационный файл App.config который содержит нужные Slave параметры для работы. 
При компиляции проекта Master в его bin\[Имя конфигурации] директории мы получим список файлов:
  • Master.exe - исполняемый файл основного проекта
  • Master.vshost.exe - файл для работы в режиме Debug (если не выбрана конфигурация Release)
  • Master.exe.config - конфигурационный файл Master-а
  • Slave.exe - исполняемый файл Slave
  • Slave.exe.config - конфигурационный файл Slave-а
На первый взгляд все нормально, но если по каким либо причинам вам понадобиться изменить App.config в Slave проекте, то возникнут проблемы. А именно скомпилированный для Master файл Slave.exe.config останется без каких либо изменений, что может конкретно осложнить вам жизненный путь к успеху :).

Решается проблема не очень сложно, нужно добавить к событию AfterBuild копирование нужно нам файла конфига.
Отрываете файл проекта Master.csproj/vbproj в любом текстовом редакторе и добавляете следующие изменения:

<Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)\[Slave_Folder]\bin\$(Configuration)\[Slave_exe_file_name].exe.config" 
          DestinationFolder="$(TargetDir)" />
  </Target>

Что для вышеописанного примера выглядит так:

<Target Name="AfterBuild">
    <Copy SourceFiles="$(ProjectDir)\Slave\bin\$(Configuration)\Slave.exe.config" 
          DestinationFolder="$(TargetDir)" />
  </Target>