通过Reflection和访问配置加载程序集时出现问题

时间:2010-07-28 09:39:23

标签: .net reflection app-config

我正在尝试使用Reflection加载.NET程序集(使用Assembly.LoadFrom方法),并在此程序集中实例化某些类型。

这一切似乎都运行正常,但是我试图实例化的一种类型在其类型初始值设定项中访问程序集的配置:它ConfigurationManager.GetSection(sectionName)。然后程序集抛出一个异常,因为找不到配置部分。

我正在加载的程序集的配置文件位于同一目录中,并且具有标准名称(即AssemblyName.dll.config),并且配置肯定具有所请求的部分。为什么找不到配置部分?加载程序集时还需要做些什么吗?

2 个答案:

答案 0 :(得分:6)

因为正在读取的配置文件是托管可执行文件的配置文件。因此,例如,如果您运行Foo.exe中的代码,则配置文件的名称应为Foo.exe.config。永远不会使用AssemblyName.dll.config。如果您在网站上运行此功能,则应使用web.config

您可以尝试使用OpenMappedExeConfiguration方法:

var configFileMap = new ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = "AssemblyName.dll.config";
var section = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None).GetSection(sectionName);

答案 1 :(得分:1)

以下映射文件,然后将其作为System.Configuration变量打开:

string FilePath = System.Reflection.Assembly.GetAssembly(typeof(EncryptDecryptViewModel)).Location 
FilePath += @".config";                
var ConfigFileMap = new ExeConfigurationFileMap();
ConfigFileMap.ExeConfigFilename = FilePath;
Configuration LocalConfigurationManager = ConfigurationManager.OpenMappedExeConfiguration(ConfigFileMap, ConfigurationUserLevel.None);

您现在可以从配置管理器中检索值,就像通过配置管理器一样,但是您的请求中必须更明确一些。

使用System.Configuration.ConfigurationManager时,以下内容有效并返回值:

string s = System.Configuration.ConfigurationManager.AppSettings["SomeSetting"];

但是当使用Configuration变量LocalConfigurationManager(来自上面的代码)时,调用类似于正常的ConfigurationManager调用,例如:

string s = LocalConfigurationManager.AppSettings["ConfigurationSections"];

尝试运行代码时会出现以下错误:

'System.Configuration.ConfigurationElement.this [System.Configuration.ConfigurationProperty]'是     由于其保护级别而无法访问

这是因为在ConfigurationManager中,AppSettings属性是NameValueCollection。在Configuration变量中,AppSettings实际上是一个System.Configuration.AppSettingsSection,它包含一个名为Settings的属性,它是一个KeyValueConfigurationCollection,因此要访问该属性,调用将如下所示:

string s = LocalConfigurationManager.AppSettings.Settings["SomeSetting"].Value;

对于Connection Strings Secion,将使用以下语法

string ConnectionString =  LocalConfigurationManager.ConnectionStrings.ConnectionStrings["connectionStringName"].ConnectionString;