VS动态修改App.config中遇到的坑(宿主进程问题)
昨天遇到了很奇怪的一个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中遇到的坑(宿主进程问题)的更多相关文章
- 在WCF程序中动态修改app.config配置文件
今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google搜了一下,在园子里的文章动态修改App.Config 和w ...
- 【C#】#103 动态修改App.config配置文件
对 C/S模式 下的 App.config 配置文件的AppSetting节点,支持配置信息现改现用,并可以持久保存. 一. 先了解一下如何获取 配置信息里面的内容[获取配置信息推荐使用这个] 1.1 ...
- ASP.NET程序中动态修改web.config中的设置项目(后台CS代码)
using System;using System.Collections;using System.ComponentModel;using System.Data;using System.Dra ...
- 修改 App.Config 配置文件 C#
[转]在WCF程序中动态修改app.config配置文件 今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google ...
- C#中动态读写App.config配置文件
转自:http://blog.csdn.net/taoyinzhou/article/details/1906996 app.config 修改后,如果使用cofnigurationManager立即 ...
- C#项目实例中读取并修改App.config文件
C#项目是指一系列独特的.复杂的并相互关联的活动,这些活动有着一个明确的目标或目的,必须在特定的时间.预算.资源限定内,依据规范完成.项目参数包括项目范围.质量.成本.时间.资源. 1. 向C#项目实 ...
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...
- WPF C#之读取并修改App.config文件
原文:WPF C#之读取并修改App.config文件 简单介绍App.config App.config文件一般是存放数据库连接字符串的. 下面来简单介绍一下App.config文件的修改和更新. ...
- 如何修改 app.config 的配置信息
如何修改 app.config 的配置信息 收藏 最问这个问题的人有点多,其实 .Net 提供了这样的功能我们可以在 app.config 中 userSettings 节点中保存我们的应用程序设置信 ...
随机推荐
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...
- Spring访问数据库(方式上跟HQL类似,每行记录映射一个实体类)
看了这篇技术博客,觉得收获较大,收藏了:http://sarin.iteye.com/blog/875915
- 使用django发送邮件(smtp)
首先在 seeting 最下面+上 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_USE_TLS = False ...
- vue组件实现查看大图效果
使用的index.vue代码 <template> <img :src="imgUrl" @click="clickImg($event)"& ...
- samba服务和nginx服务
一 samba服务 1 samba的功能:samba是一个网络服务器,是连接linux和windows之间共享文件的. 2 samba服务的启动,停止和重启: (1) 要启动Samba服务,只需用户 ...
- 2018.12.14 codeforces 932E. Team Work(组合数学)
传送门 组合数学套路题. 要求ans=∑i=0nCni∗ik,n≤1e9,k≤5000ans=\sum_{i=0}^n C_n^i*i^k,n\le 1e9,k\le 5000ans=∑i=0nCn ...
- Java翻转数组的方法
java的api没用翻转数组的工具类,只能自己写了. int [] testIntArr = {1,2,3}; //翻转数组 for (int i = 0; i < testIntArr.len ...
- openssl建立证书,非常详细配置ssl+apache
原文链接:http://blog.51yip.com/apachenginx/958.html openssl建立证书,非常详细配置ssl+apache 张映 发表于 2010-08-07 分类目录: ...
- Python 安装requests和MySQLdb
Python 安装requests和MySQLdb 2017年10月02日 0.系统版本 0.1 查看系统版本 [root@localhost ~]# uname -a Linux localhost ...
- Chapter15 Principles of Metabolic Regulation
15.1 调节代谢的通路 (1)细胞和有机体维持着动态稳定 调节作用的基因多 2500个 12% 激酶占比多 300个 一个通路受到多方调节 (2)酶的数量和催化活性 可以被调节 反应物的调控 糖酵解 ...