Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

App.Config Transformation for projects which are not Web Projects in Visual Studio?

For Visual Studio 2010 Web based application we have Config Transformation features by which we can maintain multiple configuration files for different environments. But the same feature is not available for App.Config files for Windows Services/WinForms or Console Application.

There is a workaround available as suggested here: Applying XDT magic to App.Config.

However it is not straightforward and requires a number of steps. Is there an easier way to achieve the same for app.config files?

like image 821
Amitabh Avatar asked Jun 09 '10 08:06

Amitabh


People also ask

What is difference between web config and app config?

config is parsed at runtime, so if you edit the web. config file, the web application will automatically load the changes in the config file. Â app. config is parsed at compile time, so if you edit the app.

How do I create a new transformation in web config?

If you have a web application project, Right-click on web. config and choose Add Config Transform. This will add any config transforms that are missing from your project based on build configurations (i.e. if you have Production and Staging build configs, both will get a transform added).


1 Answers

I tried several solutions and here is the simplest I personally found.
Dan pointed out in the comments that the original post belongs to Oleg Sych—thanks, Oleg!

Here are the instructions:

1. Add an XML file for each configuration to the project.

Typically you will have Debug and Release configurations so name your files App.Debug.config and App.Release.config. In my project, I created a configuration for each kind of environment, so you might want to experiment with that.

2. Unload project and open .csproj file for editing

Visual Studio allows you to edit .csproj files right in the editor—you just need to unload the project first. Then right-click on it and select Edit <ProjectName>.csproj.

3. Bind App.*.config files to main App.config

Find the project file section that contains all App.config and App.*.config references. You'll notice their build actions are set to None and that's okay:

<None Include="App.config" /> <None Include="App.Debug.config" /> <None Include="App.Release.config" /> 

Next, make all configuration-specific files dependant on the main App.config so Visual Studio groups them like it does designer and code-behind files.

Replace XML above with the one below:

<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. Activate transformations magic (still necessary for Visual Studio versions such as VS2019)

In the end of file after

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 

and before final

</Project> 

insert the following XML -- please note there are two steps for the proper transformation to occur:

  <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> 

Now you can reload the project, build it and enjoy App.config transformations!

FYI

Make sure that your App.*.config files have the right setup like this:

<?xml version="1.0" encoding="utf-8"?> <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">      <!--magic transformations here--> </configuration> 
like image 179
Dan Abramov Avatar answered Sep 27 '22 21:09

Dan Abramov