Я пробовал несколько решений, и вот самое простое, которое я нашел лично.
Дэн указал в комментариях, что исходное сообщение принадлежит Олегу Сычу - спасибо, Олег!
Вот инструкции:
1. Добавьте в проект XML-файл для каждой конфигурации.
Обычно у вас будут конфигурации Debug
и Release
, поэтому назовите файлы App.Debug.config
и App.Release.config
. В своем проекте я создал конфигурацию для каждого типа среды, так что вы можете поэкспериментировать с этим.
2. Выгрузите проект и откройте файл .csproj для редактирования.
Visual Studio позволяет редактировать файлы .csproj прямо в редакторе - вам просто нужно сначала выгрузить проект. Затем щелкните его правой кнопкой мыши и выберите Изменить ‹ProjectName› .csproj.
3. Свяжите файлы конфигурации App. *. Config с основным файлом App.config
Найдите раздел файла проекта, который содержит все ссылки App.config
и App.*.config
. Вы заметите, что их действия по сборке установлены на None
, и это нормально:
<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />
Затем сделайте все специфичные для конфигурации файлы зависимыми от главного App.config
, чтобы Visual Studio сгруппировала их так же, как файлы конструктора и файлы кода программной части.
Замените приведенный выше XML на приведенный ниже:
<None Include="App.config" />
<None Include="App.Debug.config" >
<DependentUpon>App.config</DependentUpon>
</None>
<None Include="App.Release.config" >
<DependentUpon>App.config</DependentUpon>
</None>
4. Активировать магию преобразований (по-прежнему необходимо для таких версий Visual Studio, как VS2019)
В конце файла после
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
и перед финалом
</Project>
вставьте следующий XML-код - обратите внимание, что для правильного преобразования необходимо выполнить два шага:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="BeforeBuild" Condition="Exists('App.$(Configuration).config')">
<!-- Generate transformed app config and replace it: will get the <runtime> node and assembly bindings properly populated -->
<TransformXml Source="App.config" Destination="App.config" Transform="App.$(Configuration).config" />
</Target>
<Target Name="AfterBuild" Condition="Exists('App.$(Configuration).config')">
<!-- Generate transformed app config in the intermediate directory: this will transform sections such as appSettings -->
<TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
<!-- Force build process to use the transformed configuration file from now on.-->
<ItemGroup>
<AppConfigWithTargetPath Remove="App.config" />
<AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
<TargetPath>$(TargetFileName).config</TargetPath>
</AppConfigWithTargetPath>
</ItemGroup>
</Target>
Теперь вы можете перезагрузить проект, собрать его и наслаждаться App.config
преобразованиями!
К вашему сведению
Убедитесь, что ваши App.*.config
файлы правильно настроены следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--magic transformations here-->
</configuration>
person
Dan Abramov
schedule
24.02.2011