【问题标题】:Need changable App.config file in WPF需要在 WPF 中更改 App.config 文件
【发布时间】:2012-10-26 09:48:21
【问题描述】:

我有一个桌面 WPF 应用程序,它使用 Entity Framework 4.1 Code First 方法来管理数据。

EF 将连接字符串添加到 App.config 文件中,我希望无法在运行时更改此连接字符串。

场景是这样的:

当我部署应用程序时,它在 App.config 文件中有一个默认连接字符串。用户运行应用程序,由于连接字符串可能对用户无效(因为服务器名称、用户 ID 和密码),我将显示一个服务器配置窗口。

用户将在此处输入有关其连接的有效信息,然后按确定。然后我将能够更改 App.config 文件并将用户的新有效信息保存到该文件中。

问题:

如果我使用 ConfigurationManager 更改它,更改将是临时的,这意味着文件没有保存,更改是在内存中进行的。

如果我将 App.config 文件读入流中,在内存中进行必要的更改,删除物理文件并再次将内存中的流另存为 App.config,Windows 将不允许我对 ProgramFiles 文件夹下的文件进行更改。

这里最好的方法是什么?

编辑:问题又来了!

我用这种方法修改了App.config文件后:

private void ApplyChangesToConnectionString()
{
    var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
    connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString = GetChangesAppliedConnectionString(connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString);
    config.Save(); // This line throws an exception
    ConfigurationManager.RefreshSection("connectionStrings");   
}

config.Save(); 方法调用抛出错误提示

“访问“C:\Program Files (x86)\MyCompany\MyApp\MyApp.exe.config” 被拒绝。”

我知道“程序文件”下的文件是不可变的,那么我该如何处理呢?

【问题讨论】:

标签: c# wpf deployment runtime app-config


【解决方案1】:

我无法修改 ConfigurationManager.ConnectionStrings["key"] 对象,因为它是只读的。

所以我决定在我的 App.config 文件中添加一个新的连接字符串,它看起来像这样:

<connectionStrings>
<add name="SomeUniqueName" connectionString="Data Source=(local)\SQLExpress;Initial Catalog=MyDb;User Id=sa;Password=password; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />

然后将我的 DbContext 构造函数更改为采用新添加的连接字符串,如下所示:

public MyContext()
        : base("name=SomeUniqueName")
    {

    }

这里,连接字符串和构造函数的name属性的值必须匹配。

然后为了在运行时更改这个新添加的连接字符串,我使用了这样的方法:

private void ApplyChangesToConnectionString()
    {
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var connectionStringsSection = (ConnectionStringsSection)config.GetSection("connectionStrings");
        connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString = GetChangesAppliedConnectionString(connectionStringsSection.ConnectionStrings["SomeUniqueName"].ConnectionString);
        config.Save();
        ConfigurationManager.RefreshSection("connectionStrings");   
    }

【讨论】:

    【解决方案2】:

    App.config 在我看来是正确的方法,但是我不会依赖自己亲自编写文件。相反,让框架为您完成繁重的工作。

    查看示例here

    编辑:很高兴 Sandeep 的上述评论对您有所帮助。如果您想了解更多信息,请随时查看该链接!

    【讨论】:

      【解决方案3】:

      App.config 不适合执行此操作,因为它是应用程序使用的全局配置。

      我建议您保存每个用户的设置。请参阅此相关问题:c# - approach for saving user settings in a WPF application?

      【讨论】:

      • 保存用户设置是对的,但这里的问题实际上与用户设置无关。我使用“用户”一词的一般含义,应用程序的用户不会超过一个。谢谢。
      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2010-11-24
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多