当前位置:   article > 正文

在部署 C#项目时转换 App.config 配置文件_c# debug.config release.config

c# debug.config release.config

问题

部署项目时,常常需要根据不同的环境使用不同的配置文件。例如,在部署网站时可能希望禁用调试选项,并更改连接字符串以使其指向不同的数据库。在创建 Web 项目时,Visual Studio 自动生成了 Web.configWeb.Debug.configWeb.release.config这3个不同的配置文件,并提供了转换工具,用于在部署项目时自动转换配置文件内容。具体可以参考这2篇文章:如何:在部署 Web 应用程序项目时转换 Web.config 和 用于 Web 应用程序项目部署的 Web.config 转换语法 。

然而在其他项目类型中(如控制台应用程序、Windows 服务),并没有现成的配置文件的转换功能。

临时解决方案

准备2个配置文件:App.config 和 App.Release.config ,然后修改项目 .csproj 文件,更新 AfterBuild 生成事件:

  1. <Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release' ">
  2. <Delete Files="$(TargetDir)$(TargetFileName).config" />
  3. <Copy SourceFiles="$(ProjectDir)\app.$(Configuration).config" DestinationFiles="$(TargetDir)$(TargetFileName).config" />
  4. </Target>

这样在选择 Release 配置时,执行生成操作会删除 App.config 文件,然后用 App.Release.config文件替换。虽然这样也可以实现根据环境来选择配置文件,但是这种方法需要保证这2个配置文件内容保持同步,特别是要保证 assemblyBinding 标签内容一致, 这个标签的作用是程序集版本重定向,如果不一致会抛出 “未能加载文件或程序集” 这个异常。

直到找到这篇文章 Enable app.debug.config app.release.config 时才完美解决配置文件转换的问题。

正式做法

  1. 我们在项目中添加 App.configApp.Debug.configApp.Release.config 这3个配置文件。
  2. 打开项目所在目录,用记事本或其他文本编辑器打开 .csproj 文件。
  3. 在 PropertyGroup 标签下添加如下内容:

    1. <PropertyGroup>
    2. <ProjectConfigFileName>App.config</ProjectConfigFileName>
    3. </PropertyGroup>
  4. 在 ItemGroup 标签中找到和 App.configApp.Debug.configApp.Release.config相关的项目,替换为

    1. <None Include="App.config" />
    2. <None Include="App.Debug.config">
    3. <DependentUpon>App.config</DependentUpon>
    4. </None>
    5. <None Include="App.Release.config">
    6. <DependentUpon>App.config</DependentUpon>
    7. </None>
  5. 在最后一个 Import 标签后面添加:

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
    
  6. 在 Import 标签后面添加 Target 标签:

    1. <Target Name="AfterBuild">
    2. <TransformXml Source="@(AppConfigWithTargetPath)" Transform="$(ProjectConfigTransformFileName)" Destination="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" />
    3. </Target>
  7. 切换到 Visual Studio , 重新加载项目。

这时查看 Visual Studio 可以看到 App.config 的组织方式和 Web.config 一样了。

App.config

App.config

现在就可以使用 用于 Web 应用程序项目部署的 Web.config 转换语法 这篇文章中提到的转换语法了。

例如需要替换 connectionStrings , App.config 有如下配置:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <connectionStrings>
  4. <add name="connString" connectionString="Server=debug;Database=test;Uid=root;Pwd=123456;CharSet=utf8;"
  5. providerName="MySql.Data.MySqlClient" />
  6. </connectionStrings>
  7. </configuration>

只需要修改 App.Release.config 为如下内容即可:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- 有关使用 web.config 转换的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=125889 -->
  3. <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  4. <connectionStrings>
  5. <add name="connString"
  6. connectionString="Server=release;Database=test;Uid=root;Pwd=654321;CharSet=utf8;"
  7. xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
  8. </connectionStrings>
  9. </configuration>

这样在选择 Release 配置时,connectionStrings 会自动替换成 App.Release.config 中的值。查看 bin\Release 目录下的 config 文件可以进行验证。

完整代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3. <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  4. <PropertyGroup>
  5. <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  6. <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  7. <ProjectGuid>{8196CA4E-AD25-4F90-BB80-D27512BF4BD4}</ProjectGuid>
  8. <OutputType>Exe</OutputType>
  9. <AppDesignerFolder>Properties</AppDesignerFolder>
  10. <RootNamespace>App.Config转换</RootNamespace>
  11. <AssemblyName>App.Config转换</AssemblyName>
  12. <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
  13. <FileAlignment>512</FileAlignment>
  14. </PropertyGroup>
  15. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  16. <PlatformTarget>AnyCPU</PlatformTarget>
  17. <DebugSymbols>true</DebugSymbols>
  18. <DebugType>full</DebugType>
  19. <Optimize>false</Optimize>
  20. <OutputPath>bin\Debug\</OutputPath>
  21. <DefineConstants>DEBUG;TRACE</DefineConstants>
  22. <ErrorReport>prompt</ErrorReport>
  23. <WarningLevel>4</WarningLevel>
  24. </PropertyGroup>
  25. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  26. <PlatformTarget>AnyCPU</PlatformTarget>
  27. <DebugType>pdbonly</DebugType>
  28. <Optimize>true</Optimize>
  29. <OutputPath>bin\Release\</OutputPath>
  30. <DefineConstants>TRACE</DefineConstants>
  31. <ErrorReport>prompt</ErrorReport>
  32. <WarningLevel>4</WarningLevel>
  33. </PropertyGroup>
  34. <PropertyGroup>
  35. <ProjectConfigFileName>App.config</ProjectConfigFileName>
  36. </PropertyGroup>
  37. <ItemGroup>
  38. <Reference Include="System" />
  39. <Reference Include="System.configuration" />
  40. <Reference Include="System.Core" />
  41. <Reference Include="System.Xml.Linq" />
  42. <Reference Include="System.Data.DataSetExtensions" />
  43. <Reference Include="Microsoft.CSharp" />
  44. <Reference Include="System.Data" />
  45. <Reference Include="System.Xml" />
  46. </ItemGroup>
  47. <ItemGroup>
  48. <Compile Include="Program.cs" />
  49. <Compile Include="Properties\AssemblyInfo.cs" />
  50. </ItemGroup>
  51. <ItemGroup>
  52. <None Include="App.config" />
  53. <None Include="App.Debug.config">
  54. <DependentUpon>App.config</DependentUpon>
  55. </None>
  56. <None Include="App.Release.config">
  57. <DependentUpon>App.config</DependentUpon>
  58. <SubType>Designer</SubType>
  59. </None>
  60. </ItemGroup>
  61. <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  62. <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  63. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
  64. Other similar extension points exist, see Microsoft.Common.targets.
  65. <Target Name="BeforeBuild">
  66. </Target>
  67. <Target Name="AfterBuild">
  68. </Target>
  69. -->
  70. <Target Name="AfterBuild">
  71. <TransformXml Source="@(AppConfigWithTargetPath)" Transform="$(ProjectConfigTransformFileName)" Destination="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" />
  72. </Target>
  73. </Project>

示例项目下载:
App.Config转换.zip

参考链接

如何:在部署 Web 应用程序项目时转换 Web.config
用于 Web 应用程序项目部署的 Web.config 转换语法
Enable app.debug.config app.release.config

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/190188
推荐阅读
相关标签
  

闽ICP备14008679号