[.NET]transform app.config

要如何設定 app.config 像 web.config 這樣可以依 debug or release建置不同的config呢?

同事問說 unit test 專案中,在app.config的設定值,是否能依不同狀況而讀取不同的資訊呢?

unit test 專案中如果有app.config的話,建置後會放在 組件名稱.dll.config 的檔案之中。

如下 UnitTestProject1.dll.config

image

 

那如果要依 Debug or Release 來讀取 config 中的值,

直覺就是像web.config這樣有區分 Web.Debug.config 及 Web.Release.Config 。

但是當我們新增 app.config 時,並不會多出 app.Debug.config 及 app.Release.Config 檔。

所以我們可以手動新增這2個檔案,但它們之間並不會有什麼關連,所以就要手動設定專案,如下,

image

 

那要如何讓它們有關連呢? 要手動設定專案,如下,

1.Unload 專案

image

 

2.編輯專案檔

image

image

 

3.修改 ItemGroup 中 app.config 的設定

<None Include="App.release.config" />
<None Include="App.debug.config" />
<None Include="App.config" />
改成

<Content Include="App.config" />
<Content Include="App.Debug.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>
<Content Include="App.Release.config" >
  <DependentUpon>App.config</DependentUpon>
</Content>

 

4.在最後 (</Project>前一行) 加入 以下設定

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="exists('app.$(Configuration).config')">
    <!-- Generate transformed app config in the intermediate directory -->
    <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>

 

5.存檔,重新載入專案

image

image

 

就會發現 app.config 與 app.Debug.config 及 app.Release.Config 有相依性!

image

 

那如果要在 debug 時,使用不同的設定值,則可以修改 app.Debug.config 設定,

1.configuration 加入 xdt 的設定

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

 

2.在要置換的設定,使用 replace 去置換,如下,

<add key="appName" value="RMAPName -Debug" xdt:Transform="Replace" xdt:Locator="Match(key)" />

image

 

而使用 Debug 建置出來的就會是 app.Debug.config 所設定的內容哦! 如下,

image

 

 

參考資料

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

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^