So Web Application projects have this great new feature that allows you to use an XML Transform file to merge settings into your Web.Config file based on the build configuration. For example, if you have a Release build configuration you might want your connectionString section to point to a production server instead of your development server. See this link for more information on Web Config Transforms.
This is a really cool feature and it is possible to use this with non-web application projects. You can configure your project file to support this very easily. You do need to insert some XML into your csproj file but it is really lightweight.
First, Add an App.config file to your project if you do not already have one.
Next, close Visual Studio and open your *.csproj file in notepad.
Go to the very end of the file and insert the UsingTask and Target sections directly above the </Project> closing tag.
|
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"> <span style="color: #0000ff"><</span><span style="color: #800000">Import</span> <span style="color: #ff0000">Project</span>=<span style="color: #0000ff">"$(MSBuildToolsPath)\Microsoft.CSharp.targets"</span> <span style="color: #0000ff">/></span> |
|
<span style="color: #008000"><!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
|
Other similar extension points exist, see Microsoft.Common.targets. |
|
<Target Name="BeforeBuild"> |
|
<Target Name="AfterBuild"> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">UsingTask</span> <span style="color: #ff0000">TaskName</span>=<span style="color: #0000ff">"TransformXml"</span> <span style="color: #ff0000">AssemblyFile</span>=<span style="color: #0000ff">"$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"</span> <span style="color: #0000ff">/></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">Target</span> <span style="color: #ff0000">Name</span>=<span style="color: #0000ff">"AfterCompile"</span> <span style="color: #ff0000">Condition</span>=<span style="color: #0000ff">"exists('app.$(Configuration).config')"</span><span style="color: #0000ff">></span> |
|
<span style="color: #008000"><!-- Generate transformed app config in the intermediate directory --></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">TransformXml</span> <span style="color: #ff0000">Source</span>=<span style="color: #0000ff">"app.config"</span> <span style="color: #ff0000">Destination</span>=<span style="color: #0000ff">"$(IntermediateOutputPath)$(TargetFileName).config"</span> <span style="color: #ff0000">Transform</span>=<span style="color: #0000ff">"app.$(Configuration).config"</span> <span style="color: #0000ff">/></span> |
|
<span style="color: #008000"><!-- Force build process to use the transformed configuration file from now on. --></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">ItemGroup</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">AppConfigWithTargetPath</span> <span style="color: #ff0000">Remove</span>=<span style="color: #0000ff">"app.config"</span> <span style="color: #0000ff">/></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">AppConfigWithTargetPath</span> <span style="color: #ff0000">Include</span>=<span style="color: #0000ff">"$(IntermediateOutputPath)$(TargetFileName).config"</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">TargetPath</span><span style="color: #0000ff">></span>$(TargetFileName).config<span style="color: #0000ff"></</span><span style="color: #800000">TargetPath</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">AppConfigWithTargetPath</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">ItemGroup</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">Target</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">Project</span><span style="color: #0000ff">></span> |
Now find the section that has your App.config file include. It will likely be in a <None /> tag. Replace that tag with the following code. (Include a App.CONFIGURATION.config file for each build configuration you use.
|
<pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"> <span style="color: #0000ff"><</span><span style="color: #800000">Content</span> <span style="color: #ff0000">Include</span>=<span style="color: #0000ff">"App.config"</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">SubType</span><span style="color: #0000ff">></span>Designer<span style="color: #0000ff"></</span><span style="color: #800000">SubType</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">Content</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">Content</span> <span style="color: #ff0000">Include</span>=<span style="color: #0000ff">"App.Test.config"</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">DependentUpon</span><span style="color: #0000ff">></span>App.config<span style="color: #0000ff"></</span><span style="color: #800000">DependentUpon</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">Content</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">Content</span> <span style="color: #ff0000">Include</span>=<span style="color: #0000ff">"App.Release.config"</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"><</span><span style="color: #800000">DependentUpon</span><span style="color: #0000ff">></span>App.config<span style="color: #0000ff"></</span><span style="color: #800000">DependentUpon</span><span style="color: #0000ff">></span> |
|
<span style="color: #0000ff"></</span><span style="color: #800000">Content</span><span style="color: #0000ff">></span> |
Save your csproj file and open it up in Visual Studio again.

Now when you build your solution/project the XML Transforms in your App.CONFIGURATION.config file will be merged at build time.