问题

部署项目时,常常需要根据不同的环境使用不同的配置文件。例如,在部署网站时可能希望禁用调试选项,并更改连接字符串以使其指向不同的数据库。在创建 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 生成事件:

<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release' "><Delete Files="$(TargetDir)$(TargetFileName).config" /><Copy SourceFiles="$(ProjectDir)\app.$(Configuration).config" DestinationFiles="$(TargetDir)$(TargetFileName).config" />
</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 标签下添加如下内容:

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

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

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

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

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

App.config

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

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

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

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

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

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

完整代码

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /><PropertyGroup><Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration><Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform><ProjectGuid>{8196CA4E-AD25-4F90-BB80-D27512BF4BD4}</ProjectGuid><OutputType>Exe</OutputType><AppDesignerFolder>Properties</AppDesignerFolder><RootNamespace>App.Config转换</RootNamespace><AssemblyName>App.Config转换</AssemblyName><TargetFrameworkVersion>v4.0</TargetFrameworkVersion><FileAlignment>512</FileAlignment></PropertyGroup><PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "><PlatformTarget>AnyCPU</PlatformTarget><DebugSymbols>true</DebugSymbols><DebugType>full</DebugType><Optimize>false</Optimize><OutputPath>bin\Debug\</OutputPath><DefineConstants>DEBUG;TRACE</DefineConstants><ErrorReport>prompt</ErrorReport><WarningLevel>4</WarningLevel></PropertyGroup><PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "><PlatformTarget>AnyCPU</PlatformTarget><DebugType>pdbonly</DebugType><Optimize>true</Optimize><OutputPath>bin\Release\</OutputPath><DefineConstants>TRACE</DefineConstants><ErrorReport>prompt</ErrorReport><WarningLevel>4</WarningLevel></PropertyGroup><PropertyGroup><ProjectConfigFileName>App.config</ProjectConfigFileName></PropertyGroup><ItemGroup><Reference Include="System" /><Reference Include="System.configuration" /><Reference Include="System.Core" /><Reference Include="System.Xml.Linq" /><Reference Include="System.Data.DataSetExtensions" /><Reference Include="Microsoft.CSharp" /><Reference Include="System.Data" /><Reference Include="System.Xml" /></ItemGroup><ItemGroup><Compile Include="Program.cs" /><Compile Include="Properties\AssemblyInfo.cs" /></ItemGroup><ItemGroup><None Include="App.config" /><None Include="App.Debug.config"><DependentUpon>App.config</DependentUpon></None><None Include="App.Release.config"><DependentUpon>App.config</DependentUpon><SubType>Designer</SubType></None></ItemGroup><Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /><Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" /><!-- 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><Target Name="AfterBuild"></Target>--><Target Name="AfterBuild"><TransformXml Source="@(AppConfigWithTargetPath)" Transform="$(ProjectConfigTransformFileName)" Destination="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')" /></Target>
</Project>

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

参考链接

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

在部署 C#项目时转换 App.config 配置文件相关推荐

  1. 奥塔在线:C#创建Winform项目时没有App.config文件的原因

    今天创建了一个测试的Winform项目,在进行数据库链接字符串配置时,发现没有App.config文件,一时有点懵逼. 在网上查了下资料,发现是因为创建项目时采用的.Net框架是4.0版本,而App. ...

  2. idea部署tomcat项目时,在项目里打断点不能拦截

    idea部署tomcat项目时,在项目里打断点不能拦截 以下内容都是基于我自己的项目(如未解决道友们的问题,请别介意) idea部署tomcat项目时,在项目里打断点不能拦截,工作中遇到的问题,记录一 ...

  3. C# 读取app.config配置文件 节点键值,提示 配置系统未能初始化 错误的解决方案...

    新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...

  4. 【机房重构】关于App.config配置文件

    App.Config详解 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序. 配置文件的根节点是 ...

  5. VB.NET 在项目中添加App.config的配置

    右击项目,选择属性, 在属性中选择Settings选项卡,Scope选择User 这样就会在项目中添加了App.config配置 内容: <?xml version="1.0" ...

  6. 多个项目共享一个app.config 的解决办法 (转)

    转自:http://www.cnblogs.com/xiaof2000/archive/2009/12/16/1625198.html 初用.net 2008,想写个数据库设置工作设置数据库连接,在另 ...

  7. IDEA部署Java项目时HTML,CSS等静态资源在网页上显示有问题的解决办法

    项目场景: 提示:吐槽以下,IEDA的坑是真的有点小多...: 例如:在设计Java Web项目时,导入或者自己写的html文件要么乱码,要么CSS文件引用失效等等,很离谱. 1.部署到tomcat后 ...

  8. VS2010 新建C#项目中没有app.config文件,手动添加方法

    1.在解决方案资源管理器中,右键项目名称: 2.在右键菜单中选择"添加" -> "新建项",在弹出的新建项窗口列表中,选择"应用程序配置文件&q ...

  9. C#项目中没有App.config文件,手动添加方法

    在解决方案资源管理器中,右键项目名称,在右键菜单中选择"添加"-"新建项",在弹出的新建项窗口列表中,选择"添加应用程序配置文件"选项,即可 ...

最新文章

  1. mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等
  2. boost::geometry::detail::copy_segments的用法测试程序
  3. boost::function模块实现operator()的测试程序
  4. 【Scala谜题】继承
  5. modal组件 vue_开发一个简单的 Vue 弹窗组件
  6. 白板机器学习笔记 P28-P35 支持向量机
  7. 永远不要因为这个工作不好而辞职、、、、
  8. 微云笔记控制脚本实例:远程控制脚本开关
  9. java连接数据库的详细步骤?
  10. C语言——(乘法口诀表)
  11. 2020-11-11抖音去水印解析获取源标题、作者、头像、封面图以及源视频地址
  12. R语言潜在变量模型、探索性因子分析EFA、验证性因素分析(CFA)、结构方程建模(SEM)之间的关系、潜在变量模型常用包:ltm包、sem包、OpenMx包、Lavaan包、lsa包、ca包等
  13. 2018年系统架构设计师案例分析真题及详细答案解析
  14. MGV2000_S905L系列_线刷_通刷固件
  15. 利用高德地图周边搜索api获取不同类型的餐厅推荐
  16. 【zyc的从零开始】20211012 运算符
  17. 解决 “Windows 功能” 没有Hyper-V
  18. 乐播:手机投屏和镜像有什么区别?
  19. 国标28181:什么是RTSP协议
  20. 代码随想录训练营day8

热门文章

  1. CentOS安装cheat和tldr
  2. K3CLOUD数据权限授权
  3. 16-1平衡树源代码
  4. JQuery中的Deferred-详解和使用
  5. 目录服务用户OSX: ARD的基于目录服务用户权限
  6. js取消气泡事件、阻止浏览器的默认行为
  7. Flex 学习随笔 ---- 使用WebService 与数据库连接
  8. 经济学与计算机学收入,考研心得,计算机专业跨考经济学复习经验谈
  9. html字体变大自动换行,网页css中实现字符超出宽度自动换行和英语字符不断行的解决方法...
  10. 判断mysql的关键字_mysql中查询常用的关键字