昨天遇到了很奇怪的一个bug,具体描述如下:

  这个系统是c/s架构的针对多个工厂做的资材管理系统,由于有很多个工厂,每个工厂都有自己的服务器。所以需要动态的改变连接字符串去链接不同的服务器。

  由于这个连接字符串放在了app.config文件中,所以公司上一个开发人员设置为,当选择不同公司时会让程序关闭然后去更新配置文件。近来由于公司要求,不想让程序重启然后去改变配置文件。

  原本的解决方案是当下拉框发生改变的时候,重新向新的服务器发送请求获取数据。

  但是出现了一个问题,就是项目中所用的dataset中绑定的连接字符串不会实时获取新的连接字符串。

  也就是程序中对app.config的修改没有立马产生作用。
  经过一上午的测试与查找资料,找到问题发生的原因及解决方案。

  VS2005以后,会默认生成VS宿主进程,在项目的属性 的调试项目下的一个选项。
  当启用这个功能后,在程序中对app.config所做的操作不会实时改变,而是修改*.exe.config和*.Vhost.Config,并不会直接修改App.config

  解决方法是禁用掉这一个选项,并在修改app.config方法中添加对配置文件的刷新

  

/// <summary>
/// 修改 app.config 中 connectionStrings 的方法
/// </summary>
/// <param name="AppKey"></param>
/// <param name="AppValue"></param>
public void SetConfigValue(string keyName, string conStr)
{
XmlDocument xDoc = new XmlDocument(); //获取可执行文件的路径和名称
xDoc.Load(System.Windows.Forms.Application.ExecutablePath + ".config"); XmlNode xNode;
XmlElement xElem1;
XmlElement xElem2;
xNode = xDoc.SelectSingleNode("//connectionStrings"); xElem1 = (XmlElement)xNode.SelectSingleNode("//add[@name='" + keyName + "']"); if (xElem1 != null) xElem1.SetAttribute("connectionString", conStr);
else
{
xElem2 = xDoc.CreateElement("add");
xElem2.SetAttribute("name", keyName);
xElem2.SetAttribute("connectionString", conStr);
xNode.AppendChild(xElem2);
}
xDoc.Save(System.Windows.Forms.Application.ExecutablePath + ".config");
ConfigurationManager.RefreshSection("connectionStrings");
}

关于宿主进程的详细测试如下:

用宿主进程和不用宿主进程进行调试的一些差异

1)    部分信任调试和 Click-Once 安全

部分信任调试需要宿主进程。如果禁用宿主进程,部分信任调试将不工作,即使在“项目属性”的“安全”页上启用了部分信任安全。

2)    设计时表达式计算

设计时表达式始终使用宿主进程。如果在“项目属性”中禁用宿主进程,则禁用了类库项目的设计时表达式计算。对于其他项目类型,不禁用设计时表达式计算。相反,Visual Studio 启动实际可执行文件,并将它用于不用宿主进程的设计时计算。这种差异可能产生不同的结果。

3)    AppDomain.CurrentDomain.FriendlyName 差异

AppDomain.CurrentDomain.FriendlyName 依据是否启用宿主进程返回不同的结果。如果启用宿主进程时调用 AppDomain.CurrentDomain.FriendlyName,它将返回 app_name.vhost.exe。如果禁用宿主进程时调用它,它将返回 app_name.exe。

4)    Assembly.GetCallingAssembly().FullName 差异

Assembly.GetCallingAssembly().FullName 依据是否启用宿主进程返回不同的结果。如果启用宿主进程时调用 Assembly.GetCallingAssembly().FullName,它将返回 mscorlib。如果禁用宿主进程时调用 Assembly.GetCallingAssembly().FullName,它将返回该应用程序名。

VS动态修改App.config中遇到的坑(宿主进程问题)的更多相关文章

  1. 在WCF程序中动态修改app.config配置文件

    今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google搜了一下,在园子里的文章动态修改App.Config 和w ...

  2. 【C#】#103 动态修改App.config配置文件

    对 C/S模式 下的 App.config 配置文件的AppSetting节点,支持配置信息现改现用,并可以持久保存. 一. 先了解一下如何获取 配置信息里面的内容[获取配置信息推荐使用这个] 1.1 ...

  3. ASP.NET程序中动态修改web.config中的设置项目(后台CS代码)

    using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Dra ...

  4. 修改 App.Config 配置文件 C#

    [转]在WCF程序中动态修改app.config配置文件 今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google ...

  5. C#中动态读写App.config配置文件

    转自:http://blog.csdn.net/taoyinzhou/article/details/1906996 app.config 修改后,如果使用cofnigurationManager立即 ...

  6. C#项目实例中读取并修改App.config文件

    C#项目是指一系列独特的.复杂的并相互关联的活动,这些活动有着一个明确的目标或目的,必须在特定的时间.预算.资源限定内,依据规范完成.项目参数包括项目范围.质量.成本.时间.资源. 1. 向C#项目实 ...

  7. 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)

    原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...

  8. WPF C#之读取并修改App.config文件

    原文:WPF C#之读取并修改App.config文件 简单介绍App.config App.config文件一般是存放数据库连接字符串的.  下面来简单介绍一下App.config文件的修改和更新. ...

  9. 如何修改 app.config 的配置信息

    如何修改 app.config 的配置信息 收藏 最问这个问题的人有点多,其实 .Net 提供了这样的功能我们可以在 app.config 中 userSettings 节点中保存我们的应用程序设置信 ...

随机推荐

  1. java 内存, 类加载g

    1. java 内存区域 方法区 虚拟机栈 本地方法栈 堆 程序计数器 其中 :  方法区  和 堆 是所有线程共享的 , 其他是线程隔离的 1.  程序计数器 : 可以看做是当前线程所执行的字节码的 ...

  2. jvm运行机制和volatile关键字详解

    参考https://www.cnblogs.com/dolphin0520/p/3920373.html JVM启动流程 1.java虚拟机启动的命令是通过java +xxx(类名,这个类中要有mai ...

  3. [html]Sublime Text添加插件

    今天想在Sublime Text(简称ST)内编写HTML后直接使用浏览器看效果,想添加View in Browser插件,然后遇到奇怪的问题添加插件直接报"找不到有用的插件" 一 ...

  4. 使用SpringMVC的@CrossOrigin注解解决跨域请求问题

    跨域问题,通俗说就是用ajax请求其他站点的接口,浏览器默认是不允许的.同源策略(Same-orgin policy)限制了一个源(orgin)中加载脚本或脚本与来自其他源(orgin)中资源的交互方 ...

  5. ManageEngine OMP帮助台委派

  6. sqlserver中的CHARINDEX用法

    CHARINDEX作用 写SQL语句我们经常需要判断一个字符串中是否包含另一个字符串,但是SQL SERVER中并没有像C#提供了Contains函数,不过SQL SERVER中提供了一个叫CHAEI ...

  7. Java 208 道面试题:Java 基础模块答案

    目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态:第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多 ...

  8. Java泛型总结——吃透泛型开发

    什么是泛型 泛型是jdk5引入的类型机制,就是将类型参数化,它是早在1999年就制定的jsr14的实现. 泛型机制将类型转换时的类型检查从运行时提前到了编译时,使用泛型编写的代码比杂乱的使用objec ...

  9. Arbiter

    from  2015-EDCAV-Problems encountered in various arbitration techniques used in NOC router-A survey ...

  10. php接口 接受ios或android端图片; php接收NSData数据

    备注下, [自己无意中用的方法]接收时,设置两个参数,一个是图片名称,另一个是实际文件.然后用$_FILES处理就可以了. 如: $icon = $_POST['icon'];//这个是图片的名称,用 ...