欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

VS动态修改App.config中遇到的坑(宿主进程问题)

程序员文章站 2022-10-16 14:35:31
昨天遇到了很奇怪的一个bug,具体描述如下: 这个系统是c/s架构的针对多个工厂做的资材管理系统,由于有很多个工厂,每个工厂都有自己的服务器。所以需要动态的改变连接字符串去链接不同的服务器。 由于这个连接字符串放在了app.config文件中,所以公司上一个开发人员设置为,当选择不同公司时会让程序关 ......

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

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

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

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

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

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

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

VS动态修改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,它将返回该应用程序名。

上一篇: 今天出门

下一篇: Dijkstra