工作中遇到这样的需求:
说有这么一个项目
发布成 Debug 模式的时候, 访问的是 测试服务器。发布成 Release 模式的时候, 访问的是 正式服务器。服务器的 域名 / 路径 / 端口 信息,是存储在 app.config 里面的。
一开始的时候,端口号是一样的。
对于 Debug 模式, 访问的是 http://局域网的测试服务器:8080
对于 Release 模式, 访问的是 .不可说不可说.com:8080为了避免 每次生成代码的时候, 都重复地 修改 app.config 。
配置文件里面,就写死了, 是 .不可说不可说.com:8080然后,在测试计算机上面,修改 C:\Windows\System32\drivers\etc\hosts 文件。
增加一行局域网的测试服务器IP地址 www.不可说不可说.com例如:
192.168.1.2 www.不可说不可说.com运行了一段时间,一切还好。
-------------------- 分割线 --------------------
但是不久以后,新的需求来了。需要有 远程测试的功能。端口号要不一样了。对于 Debug 模式, 访问的是 .不可说不可说.com:9090
对于 Release 模式, 访问的是 .不可说不可说.com:8080 一想到每次发布不同的版本,都要去修改 app.config. 就脑袋疼啊。想到 Web 项目里面, 可以有 Web.config / Web.Debug.config / Web.Release.config 这种模式的。 App.config 可以有么?网上查询了一下,好像是没有找到。只有自己想想解决办法了。 查看了一下 项目里面, 有个 “生成事件” 的选项。 暂时想到一个解决办法。勉强能避免每次发布时,根据 Debug / Release 手动 修改配置文件的情况。 -------------------- 分割线 --------------------下面是一个简单的测试可行性的例子.
app.config 中只包含一个 字符串信息。通过 “生成事件”, 动态地 替换掉 app.config 首先是那个 测试的属性.图片1: 测试的代码.图片2:
项目的结构:
图片3:
项目包含 app.config / app.Debug.config / app.Release.config
app.Debug.config 部分内容<applicationSettings>
<A4001_DebugRelease.Properties.Settings> <setting name="TestName" serializeAs="String"> <value>我现在运行在 Debug 模式下</value> </setting> </A4001_DebugRelease.Properties.Settings></applicationSettings> app.Release.config 部分内容<applicationSettings>
<A4001_DebugRelease.Properties.Settings> <setting name="TestName" serializeAs="String"> <value>我现在运行在 Release 模式下</value> </setting> </A4001_DebugRelease.Properties.Settings></applicationSettings>
重要的在这里
图片4: copy $(ProjectDir)app.Debug.config $(ProjectDir)bin\Debug\$(TargetName).exe.configcopy $(ProjectDir)app.Release.config $(ProjectDir)bin\Release\$(TargetName).exe.config 作用就是 当编译处理结束后,用 项目中的 app.Debug.config 替换掉 Debug 目录下的 config用 项目中的 app.Release.config 替换掉 Release 目录下的 config
测试运行结果
图片5: 图片6:
-------------------- 分割线 --------------------
这么折腾一下以后, 可以不用 在 Debug / Release 切换的时候, 修改 app.config 了。缺点嘛,就是 SVN 服务器上面, 又要多两个文件了 ......
-------------------- 最后的分割线 --------------------
说话我把测试项目测试好, Debug / Release 都测试好了, 往服务器上传代码的时候,竟然失败了...
难道是代码写得不够好?再仔细看看那2行copy $(ProjectDir)app.Debug.config $(ProjectDir)bin\Debug\$(TargetName).exe.config
copy $(ProjectDir)app.Release.config $(ProjectDir)bin\Release\$(TargetName).exe.config每次都要复制2个文件, 也不环保啦。
修改修改最后修改成下面这个样子:
copy $(ProjectDir)app.$(ConfigurationName).config $(ProjectDir)bin\$(ConfigurationName)\$(TargetName).exe.config
恩,看上去顺眼多了...