0

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

我有一个 .DLL 作为加载项/插件从另一个应用程序加载,并且希望独立于加载它的主应用程序,基于机器、.dll(=executable)、漫游用户保留特定于此的配置设置或用户个人资料。

我找到了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 年多没有使用它来赚取日常面包后会生锈。

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

4

2 回答 2

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);

配置将按以下顺序读取:

来源MSDN 博客

对于样本搜索User.configc:\Users\[User]\AppData。另见CP文章

代码示例:

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
}
于 2013-02-03T19:29:06.337 回答
-2

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

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

于 2013-02-03T17:45:45.000 回答