声明插件DLL的每用户(漫游用户)配置设置?

时间:2013-02-03 17:25:37

标签: c# windows plugins configuration app-config

如何为从其他应用程序加载的特定插件.DLL的每个(漫游)用户配置设置设置支持?

我有一个.DLL作为外接程序/插件从另一个应用程序加载,并希望根据计算机,.dll(=可执行文件)独立于加载它的主应用程序保留特定于此的配置设置,漫游用户或用户个人资料。

我发现System.Configuration.ExeConfigurationFileMap类可能提供我需要的内容,但我无法弄清楚如何设置特定于我的(插件)应用程序的正确路径。

到目前为止我的代码是:

public class MyConfigurationSettings : ConfigurationSection
{
    public static MyConfigurationSettings GetSection (ConfigurationUserLevel ConfigLevel) 
    {
        string configFile = Assembly.GetAssembly(typeof(MyConfigurationSettings)).Location + ".config";
        ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap();
        configFileMap.ExeConfigFilename = configFile;
        configFileMap.LocalUserConfigFilename = <localUserConfigFile>; // ??? What filename to place here and how to get it based on the current environment ???
        configFileMap.RoamingUserConfigFilename = <roamingUserConfigFile>; // ???;

        System.Configuration.Configuration Config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigLevel);
        // ...
    }
}

有人能指出我正确的方向吗?可用的文档和搜索结果太令人困惑或不足以让我做到这一点。对不起,如果这似乎是一个愚蠢的问题,但是我的C#(.NET)技能将在4年多之后变得生锈,而不是用它来赚取每日面包。

我还认为这不是主要关于配置设置管理的问题,而是如何获取特定于安装的应用程序实例配置的路径。

2 个答案:

答案 0 :(得分:3)

您设置RoamingUserConfigFilename = RoamingName.config并将其置于漫游配置文件下

%AppData%\[AppName]\[Vendor]\[CodedPath]\[Version]\RoamingName.config

您还设置LocalUserConfigFilename = LocalName.config并将其置于本地资料:

%LocalAppData%\[AppName]\[Vendor]\[CodedPath]\[Version]\LocalName.config

现在致电

ConfigurationManager.OpenMappedExeConfiguration(
    exeMap,
    ConfigurationUserLevel.PerUserRoamingAndLocal);
将按以下顺序读取

配置:

http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-components-postattachments/00-04-21-25-76/config1.jpg

来自MSDN blogs

User.config下搜索c:\Users\[User]\AppData的样本。另请参阅CP article

代码示例:

public static MyConfigurationSettings GetSection (ConfigurationUserLevel ConfigLevel) 
{
    try
    {
        string appDataPath = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        string localDataPath = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        System.Configuration.ExeConfigurationFileMap exeMap = new ExeConfigurationFileMap();
        exeMap.ExeConfigFilename = System.IO.Path.Combine(appDataPath, @"MyCompany\MyPlugin\Default.config");
        exeMap.RoamingUserConfigFilename = System.IO.Path.Combine(appDataPath, @"MyCompany\MyPlugin\Roaming.config");
        exeMap.LocalUserConfigFilename = System.IO.Path.Combine(localDataPath, @"MyCompany\MyPlugin\Local.config");

        System.Configuration.Configuration Config = ConfigurationManager.OpenMappedExeConfiguration(exeMap,ConfigLevel);

        return (MyConfigurationSettings)Config.GetSection("MyConfigurationSettings");

    }
    catch (Exception ex) {
        // ...
    }
    return null; // or throw an appropriate exception
}

答案 1 :(得分:-2)

通常从您放入的特殊文件夹中加载配置,并将其放入其中一个漫游(即非本地)位置。操作系统根据漫游规范处理其余部分。

ConfigSections的使用完全无关紧要,除非非常特别需要使用配置文件。在过去10年中我见过的任何.NET项目中,此文件从未用于特定于用户的设置。