多个应用程序,共享设置:使用注册表或基于XML的配置?

sni*_*ker 6 c# registry configuration configuration-management

我的情景

我有一个类库,将从多个单独的可执行应用程序中调用.此类库需要知道要访问的数据库服务器的地址(以及许多其他配置选项,身份验证信息等).我有一个独立于类库的配置和管理应用程序,它还需要知道并设置这些配置选项.

我的问题

通常的做法是在Windows注册表中存储这些特定于用户的配置选项,还是首选对类库使用典型的"App.config"XML方法,并允许配置工具更改和修改它?

我倾向于注册表方法,但我知道许多人对不使用它有意见.你会怎么做?

Kev*_*vin 5

最佳做法是在用户的%appdata%目录中使用XML配置文件.

有许多的原因:

  1. 您的应用程序最有可能安装到Program Files中.如果用户未授予(或已授予)应用程序进程的管理权限,您将无法写入该文件.
  2. 我已经在部分受信任的环境中工作,注册表访问根本不是一个选项.客户端已完全禁用该服务器上的.NET运行时的注册表权限.
  3. 您的用户应始终可以访问自己的%appdata%目录.这是一个示例:

    string configFilePath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "myAppConfig.config";
    ExeConfigurationFileMap map = new ExeConfigurationFileMap();
    map.ExeConfigFilename = configFilePath;
    Configuration cfg = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
    cfg.AppSettings.Settings.Add("mySetting", "myValue!");
    cfg.Save(ConfigurationSaveMode.Modified);
    
    // to read the setting back
    
    string mySetting = cfg.AppSettings.Settings["mySetting"].Value;
    // at this point, mySetting = "myValue!"
    
    Run Code Online (Sandbox Code Playgroud)

请记住将System.Configuration v2.0.0.0引用添加到您的项目中!默认的System.Configuration命名空间没有所有必需的类.


sni*_*ker 0

在我的具体情况下,这些特定的配置设置存储在注册表中更有意义。我不能肯定我们的用户会将应用程序安装到相同的位置,至少,我必须将“主”配置 XML 文件的位置存储在注册表中,以便其他应用程序可以找到它。

我只是创建了一个带有索引的类,用于像哈希表 ( ) 一样向注册表读取/写入配置设置,string ponySetting = myRegistryObject["DefaultPonySetting"]然后就到此为止了。无论如何,我在所有其他应用程序中引用此类的主程序集。胡扎