如何从程序集配置文件中检索AppSettings?

18

我想从名为MyAssembly.dll.config的程序集配置文件中检索AppSetting键。以下是配置文件的示例:

<configuration>
    <appSettings>
        <add key="MyKey" value="MyVal"/>
    </appSettings>
</configuration>

以下是检索它的代码:

var myKey = ConfigurationManager.AppSettings["MyKey"];

5个回答

23

使用OpenMappedExeConfiguration方法会返回一个"Configuration"对象,您可以使用它来查看类库的配置(存在的设置将覆盖主应用程序配置中同名的设置):

ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "ConfigLibrary.config";

Configuration libConfig = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

AppSettingsSection section = (libConfig.GetSection("appSettings") as AppSettingsSection);
value = section.Settings["Test"].Value;

但是,那些仅存在于主应用程序配置中而在类库自己的配置中不存在的设置仍然可以通过ConfigurationManager静态类进行访问:

string serial = ConfigurationManager.AppSettings["Serial"];

这仍然有效-类库的配置仅隐藏其配置文件中的设置;此外,您还需要使用"libConfig实例来获取访问类库自己的配置设置。

这两个世界(主要app.config,classlibrary.config)可以完全且非常愉快地共存 - 没有任何问题!

Marc


2
如果我的自定义配置文件中没有appsettings节点怎么办?我有<Extensions>节点。那么如何在不使用AppSettingsSection的情况下获取节点? - Shesha
1
还有一件事情需要注意:除非你传递一个完整路径给ExeConfigFilename,否则你将会得到一个存储在C:\Windows\System32而不是你期望的应用程序目录下的文件。 - DonBoitnott

7
var appSettings = ConfigurationManager.OpenExeConfiguration((Assembly.GetAssembly(typeof(MYASSEMBLY))).Location).AppSettings;

然后您可以按照上述步骤进行操作。

0
var uri = new Uri(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().CodeBase));
var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = Path.Combine(uri.LocalPath, "MyAssembly.dll.config") };
var assemblyConfig = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 

你不会真的得到一个“Configuration”对象,而是从OpenMappedExeConfiguration调用中获得它,如果你使用它,那么你可以查看映射配置文件的内部,但如果你使用ConfigurationManager.AppSettings[],你仍然会得到主应用程序的配置。 - marc_s

0

你也可以将它作为XmlDocument打开,并使用Xpath导航文档。然后总有LinqToXml


-1
Using System.Configuration
Public Shared Function AppDomainConfiguration() As Configuration
  Dim fileMap As New ExeConfigurationFileMap
  fileMap.ExeConfigFilename = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
  Return ConfigurationManager.OpenMappedExeConfiguration(fileMap,Configuration.ConfigurationUserLevel.None)
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接