【问题标题】:Problem loading assembly via Reflection and accessing configuration通过反射和访问配置加载程序集时出现问题
【发布时间】:2011-03-22 01:33:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net reflection app-config


    【解决方案1】:

    因为正在读取的配置文件是托管可执行文件的配置文件。例如,如果你从Foo.exe 运行代码,你的配置文件应该命名为Foo.exe.configAssemblyName.dll.config 从未使用过。如果你在网站上运行它,那么你应该使用web.config

    您可以尝试使用OpenMappedExeConfiguration 方法:

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

    【讨论】:

    • 好的,有道理。有什么(好的)方法可以使用我正在加载的程序集中的配置吗?也许以某种方式将它合并到我的应用程序的配置中......?
    • 是的,您可以使用OpenMappedExeConfiguration 方法来指定要打开并从中读取值的配置文件的位置。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-11
      • 2020-01-24
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2022-07-16
      相关资源
      最近更新 更多