工作中遇到这样的需求:

说有这么一个项目
发布成 Debug 模式的时候, 访问的是 测试服务器。
发布成 Release 模式的时候, 访问的是 正式服务器。

服务器的 域名 / 路径 / 端口 信息,是存储在 app.config 里面的。

 


一开始的时候,端口号是一样的。

对于 Debug 模式, 访问的是  http://局域网的测试服务器:8080
对于 Release 模式, 访问的是  http://www.不可说不可说.com:8080

为了避免 每次生成代码的时候, 都重复地 修改 app.config 。
配置文件里面,就写死了, 是 http://www.不可说不可说.com:8080

然后,在测试计算机上面,修改 C:\Windows\System32\drivers\etc\hosts 文件。
增加一行
局域网的测试服务器IP地址  www.不可说不可说.com

例如:
192.168.1.2      www.不可说不可说.com

运行了一段时间,一切还好。

 

-------------------- 分割线 --------------------


但是不久以后,新的需求来了。
需要有 远程测试的功能。
端口号要不一样了。

对于 Debug 模式, 访问的是  http://www.不可说不可说.com:9090
对于 Release 模式, 访问的是  http://www.不可说不可说.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.config
copy $(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

 

恩,看上去顺眼多了...