原因是这样的,把App.config放在本地路径下,总是会被别人看到,即使采用了加密手段,也还是会有少许问题,客户提出使用加密狗的模式,也就是把App.config中的数据库连接部分存放在加密狗中,插入狗,程序读取,然后连接数据库。问题是我现在使用Microsoft.Practices.EnterpriseLibrary.Data,好像仅传入connectionStrings,Microsoft.Practices.EnterpriseLibrary.Data就会自行读取里头的内容,我如何在系统运行时,动态修改App.config的内容?而且不进行存盘处理。
这个链接提到的好像还是要建立一个配置文件,只是这个配置文件可以不是App.config,但是我目前希望的是这个config文件不被保存在硬盘中,由程序在运行过程中有内存中创建。
读取connectionStrings配置节 ///<summary> ///依据连接串名字connectionName返回数据连接字符串 ///</summary> ///<param name="connectionName"></param> ///<returns></returns> private static string GetConnectionStringsConfig(string connectionName) { string connectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString.ToString(); Console.WriteLine(connectionString); return connectionString; } 4.2 更新connectionStrings配置节 ///<summary> ///更新连接字符串 ///</summary> ///<param name="newName">连接字符串名称</param> ///<param name="newConString">连接字符串内容</param> ///<param name="newProviderName">数据提供程序名称</param> private static void UpdateConnectionStringsConfig(string newName, string newConString, string newProviderName) { bool isModified = false; //记录该连接串是否已经存在 //如果要更改的连接串已经存在 if (ConfigurationManager.ConnectionStrings[newName] != null) { isModified = true; } //新建一个连接字符串实例 ConnectionStringSettings mySettings = new ConnectionStringSettings(newName, newConString, newProviderName); // 打开可执行的配置文件*.exe.config Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 如果连接串已存在,首先删除它 if (isModified) { config.ConnectionStrings.ConnectionStrings.Remove(newName); } // 将新的连接串添加到配置文件中. config.ConnectionStrings.ConnectionStrings.Add(mySettings); // 保存对配置文件所作的更改 config.Save(ConfigurationSaveMode.Modified); // 强制重新载入配置文件的ConnectionStrings配置节 ConfigurationManager.RefreshSection("ConnectionStrings"); } 4.3 读取appStrings配置节 ///<summary> ///返回*.exe.config文件中appSettings配置节的value项 ///</summary> ///<param name="strKey"></param> ///<returns></returns> private static string GetAppConfig(string strKey) { foreach (string key in ConfigurationManager.AppSettings) { if (key == strKey) { return ConfigurationManager.AppSettings[strKey]; } } return null; } 4.4 更新connectionStrings配置节 ///<summary> ///在*.exe.config文件中appSettings配置节增加一对键、值对 ///</summary> ///<param name="newKey"></param> ///<param name="newValue"></param> private static void UpdateAppConfig(string newKey, string newValue) { bool isModified = false; foreach (string key in ConfigurationManager.AppSettings) { if(key==newKey) { isModified = true; } } // Open App.Config of executable Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // You need to remove the old settings object before you can replace it if (isModified) { config.AppSettings.Settings.Remove(newKey); } // Add an Application Setting. config.AppSettings.Settings.Add(newKey,newValue); // Save the changes in App.config file. config.Save(ConfigurationSaveMode.Modified); // Force a reload of a changed section. ConfigurationManager.RefreshSection("appSettings"); }
{ string connectionString = string.Empty;
if (ConfigurationManager.ConnectionStrings[connectionName] != null)
{
connectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
}
return connectionString;
}
2.更新连接字符串/// ///更新连接字符串 /// ///连接字符串名称 ///连接字符串内容 ///数据提供程序名称 private static void UpdateConnectionStringsConfig(string newName, string newConString, string newProviderName)
{ bool isModified = false; //记录该连接串是否已经存在 //如果要更改的连接串已经存在 if (ConfigurationManager.ConnectionStrings[newName] != null)
{ isModified = true; } //新建一个连接字符串实例 ConnectionStringSettings mySettings = new ConnectionStringSettings(newName, newConString, newProviderName); // 打开可执行的配置文件*.exe.config Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // 如果连接串已存在,首先删除它 if (isModified)
{ config.ConnectionStrings.ConnectionStrings.Remove(newName); } // 将新的连接串添加到配置文件中. config.ConnectionStrings.ConnectionStrings.Add(mySettings); // 保存对配置文件所作的更改 config.Save(ConfigurationSaveMode.Modified); // 强制重新载入配置文件的ConnectionStrings配置节 ConfigurationManager.RefreshSection("ConnectionStrings"); }
3.获取AppSettings指点项 ///
///返回*.exe.config文件中appSettings配置节的value项
///
///
///
private static string GetAppConfig(string strKey)
{
foreach (string key in ConfigurationManager.AppSettings)
{
if (key == strKey)
{
return ConfigurationManager.AppSettings[strKey];
}
} return null;
}
4.添加更新AppSettings指点项 ///
///在*.exe.config文件中appSettings配置节增加一对键、值对
///
///
///
private static void UpdateAppConfig(string newKey, string newValue)
{
bool isModified = false; foreach (string key in ConfigurationManager.AppSettings)
{
if (key == newKey)
{
isModified = true;
}
} // Open App.Config of executable Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); // You need to remove the old settings object before you can replace it if (isModified)
{
config.AppSettings.Settings.Remove(newKey);
} // Add an Application Setting. config.AppSettings.Settings.Add(newKey, newValue); // Save the changes in App.config file. config.Save(ConfigurationSaveMode.Modified); // Force a reload of a changed section. ConfigurationManager.RefreshSection("appSettings");
}
开发过程中,直接赋值,便于调试。
把调用App.config信息的代码改成调用静态变量。2.发布时,把信息存入到软件锁中
软件源代码中,静态变量置空3.运行时,先读锁验证,再读配置信息,
把值给全局静态类的静态变量。另外注意:软件锁不是作为存储器设计的,寿命不长,这样当存储介质使用,不知能否用三、五年。
System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None); config.AppSettings.Settings["PortName"].Value = this.textBox1.Text;
config.Save(System.Configuration.ConfigurationSaveMode.Modified);
System.Configuration.ConfigurationManager.RefreshSection("appSettings"); this.textBox1.Text = System.Configuration.ConfigurationManager.AppSettings["PortName"].ToString();使用这个方法,不会修改config文件,但是从此之后使用System.Configuration.ConfigurationManager.AppSettings读取出来的内容已经是修改过的值了,唯一不清楚的是Microsoft.Practices.EnterpriseLibrary是否还是会调用到这个结果