Imagine the following situation: One codebase, two customers with different Application Configuration files. How can we easily switch between the different configurations? By taking advantage of the Build Configurations functionality in Visual Studio we can easily switch between different configurations:

A brute-force solution would be to add a Post-build Event that copies the desired App.Config file to the destination directory. In the Microsoft.Common.targets file (usually at C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727) around line 725 you can read how MSBuild chooses the App.Config that is copied to the destination folder:
Choose exactly one app.config to be the main app.config that is copied to the destination folder.
The search order is:
- Choose the value $(AppConfig) set in the main project.
- Choose @(None) App.Config in the same folder as the project.
- Choose @(Content) App.Config in the same folder as the project.
- Choose @(None) App.Config in any subfolder in the project.
- Choose @(Content) App.Config in any subfolder in the project.
Thus, simply setting $(AppConfig) should be enough to make sure that MSBuild chooses the appropriate App.Config file. Here is an example of a csproj section that defines $(AppConfig) as App.Customer1.Config or App.Customer2.Config depending on the choosen Build configuration:
<propertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug Customer1|AnyCPU' "> <debugSymbols>true</debugSymbols> <debugType>full</debugType> <optimize>false</optimize> <outputPath>bin\Debug\</outputPath> <defineConstants>DEBUG;TRACE</defineConstants> <errorReport>prompt</errorReport> <warningLevel>4</warningLevel> <appConfig>App.Customer1.Config</appConfig> </propertyGroup> <propertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug Customer2|AnyCPU' "> <debugSymbols>true</debugSymbols> <outputPath>bin\Debug Customer2\</outputPath> <defineConstants>DEBUG;TRACE</defineConstants> <debugType>full</debugType> <platformTarget>AnyCPU</platformTarget> <codeAnalysisUseTypeNameInSuppression>true</codeAnalysisUseTypeNameInSuppression> <codeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</codeAnalysisModuleSuppressionsFile> <errorReport>prompt</errorReport> <appConfig>App.Customer2.Config</appConfig> </propertyGroup>
Pingback: Tim Van Wassenhove » Archive » Easily switching between configuration files with MSBuild
Does it work with Web projects…I tried it and it does not seem to work. Do you have any workaround for a web project so I can have multible web.[Build].config but choose only the config on the type of build?
I’m confused…I’m not familiar with MSBuild. I’ve got a vbproj, and I can’t find any file that resembles that xml build file anywhere.
I’ve added a new solution configuration, now where do I go to make it pick up a different app.config?
Don’t worry I found it in .vbproj. Explorer doesn’t do a very good job of searching for files.