代码之家  ›  专栏  ›  技术社区  ›  Graham Clark

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

  •  3
  • Graham Clark  · 技术社区  · 14 年前

    我正在尝试加载带有反射的.NET程序集(使用 Assembly.LoadFrom 方法),并在此程序集中实例化一些类型。

    这一切似乎都很好,但我试图实例化的一个类型在其类型初始值设定项中访问程序集的配置:它确实 ConfigurationManager.GetSection(sectionName) . 然后程序集将引发异常,因为找不到配置节。

    我正在加载的程序集的配置文件在同一目录中,并且具有标准名称(即 AssemblyName.dll.config ,配置中肯定有正在请求的部分。为什么找不到配置部分?装载组件时是否需要做一些额外的工作?

    2 回复  |  直到 13 年前
        1
  •  6
  •   Darin Dimitrov    14 年前

    因为正在读取的配置文件是宿主可执行文件的配置文件。例如,如果您运行的代码来自 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);
    
        2
  •  1
  •   Wes Grant    13 年前

    以下映射文件,然后将其作为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"];
    

    但是,当使用配置变量localconfigurationmanager(来自上面的代码)时,调用类似于普通configurationmanager调用,例如:

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

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

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

    这是因为在ConfigurationManager中,AppSettings属性是一个NameValueCollection。在配置变量中,appsettings实际上是一个system.configuration.appsettings节,其中包含一个名为settings的属性,该属性是keyValueConfigurationCollection,因此要访问该属性,调用如下所示:

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

    对于连接字符串secion,将使用以下语法

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