原因是这样的,把App.config放在本地路径下,总是会被别人看到,即使采用了加密手段,也还是会有少许问题,客户提出使用加密狗的模式,也就是把App.config中的数据库连接部分存放在加密狗中,插入狗,程序读取,然后连接数据库。问题是我现在使用Microsoft.Practices.EnterpriseLibrary.Data,好像仅传入connectionStrings,Microsoft.Practices.EnterpriseLibrary.Data就会自行读取里头的内容,我如何在系统运行时,动态修改App.config的内容?而且不进行存盘处理。

解决方案 »

  1.   


    这个链接提到的好像还是要建立一个配置文件,只是这个配置文件可以不是App.config,但是我目前希望的是这个config文件不被保存在硬盘中,由程序在运行过程中有内存中创建。
      

  2.   


    读取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"); }
      

  3.   

    1.获取连接字符串//////依据连接串名字connectionName返回数据连接字符串/////////private static string GetConnectionStringsConfig(string connectionName)
    {    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"); 
            }
      

  4.   

    楼主的想法可以实现 App.config本来就只是个存放简单配置信息的文件,改一下用法就行了:1. 把App.config中的相关信息以静态变量的方式存入一个全局静态类中.
      开发过程中,直接赋值,便于调试。
      把调用App.config信息的代码改成调用静态变量。2.发布时,把信息存入到软件锁中
     软件源代码中,静态变量置空3.运行时,先读锁验证,再读配置信息,
      把值给全局静态类的静态变量。另外注意:软件锁不是作为存储器设计的,寿命不长,这样当存储介质使用,不知能否用三、五年。
      

  5.   

    这个方法还是保存成config文件了,因此不能用
      

  6.   

    我用的是新型的加密锁,可以支持存储,就是使用flash,10万次的擦写
      

  7.   


                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是否还是会调用到这个结果
      

  8.   

    随便   写个算法  把密码变一下 。 看见的config  密码   是要变换的。  看了也没用。