Подтвердить что ты не робот

App.config для дочернего проекта не копируется на вывод

У меня есть решение с двумя исполняемыми проектами.

Main.exe зависит от Subordinate.exe.

Эти проекты имеют файлы App.config, поэтому в их соответствующих каталогах вывода у меня есть Main.exe.config и Subordinate.exe.config.

Когда я создаю Main.exe, Subordinate.exe копируется в главную директорию вывода, но Subordinate.exe.config нет.

Есть ли стандартный способ сообщить Visual Studio об этом?

4b9b3361

Ответ 1

Щелкните правой кнопкой мыши по проекту Main и выберите Edit Project File. Добавьте событие AfterBuild:

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

Ответ 2

Другим способом, который я нашел, является добавление файла app.config в качестве связанного файла в зависимый проект, например. здесь вы должны добавить ссылку на Subordinate.exe app.config в проект Main.exe и установить ее при копировании в выходной каталог. Затем вы можете изменить имя файла, который скопирован в каталог вывода Main.exe во время сборки, отредактировав элемент <Link> в файле проекта, например:

<None Include="..\Subordinate.ProjectFolder\app.config">
  <Link>Subordinate.exe.config</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

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

Ответ 3

Посмотрите этот ответ (на основе работы @theyetiman). Это требует в основном модификации проекта, к которому принадлежит файл app.config. Проекты потребления остаются неизмененными.

<ItemGroup>
  <None Include="app.config" />
</ItemGroup>
<ItemGroup>
  <None Include="app.config">
    <Link>$(TargetFileName).config</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>

Также обратите внимание, что с Visual Studio 2017 эта модификация больше не нужна. Если вы откроете решение с проектом, содержащим описанное выше решение, в окне ошибок отображается предупреждение, подобное приведенному ниже:

Файл app.config не может быть добавлен в проект. Невозможно добавить ссылку на файл... \app.config. Этот файл находится внутри дерева каталога проекта.

Добавьте условие сравнения $(VisualStudioVersion), чтобы избежать этого предупреждения и сохранить обратную совместимость:

<ItemGroup>
  <None Include="app.config" />
</ItemGroup>
<ItemGroup Condition="'$(VisualStudioVersion)' &lt; '15.0'">
  <None Include="app.config">
    <Link>$(TargetFileName).config</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>