使用Configuration Manager.GetSection和Configuration Manager.OpenExe

时间:2010-10-21 14:32:54

标签: c# configuration mef

我有一个通过MEF使用DLL的可执行文件。我使用

成功加载每个DLL的配置文件的appsettings键
    var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
        return appConfig.AppSettings.Settings["Version"].Value; 

现在我想这样做,因此DLL允许DLL的配置文件中的adhoc项目。

所以我把它添加到配置文件

    <configSections>
            <section name="AdHocRules" type="BusinessRules.AdHocConfiguration, BusinessRules" />
    </configSections>   
                <AdHocRules BaseRuleNumber="ConfigEx1" RuleName="Config Example" EffectiveDate="5/1/2010" Value="Example" IsValid="true"/>

我创建了一个课程来阅读上述内容。当我在不使用DLL的测试控制台应用程序中运行它时 - 所有内容都被编译在一起,并且单个应用程序配置一切正常

但是 - 我想使用DLL的配置文件而且我一直收到错误

  

无法投射类型的对象   'System.Configuration.DefaultSection'   输入   “BusinessRules.AdHocConfiguration

这不起作用; - 它正在抛出上述

var cm = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
AdHocConfiguration adhoc = (AdHocConfiguration)cm.GetSection("AdHocRules");

这是代码 - adhoc为null,因为它没有从正确的配置文件加载

    AdHocConfiguration adhoc = (AdHocConfiguration)ConfigurationManager.GetSection("AdHocRules");


            BusinessRules.Rule r = new BusinessRules.Rule();
            r.BaseRuleNumber = adhoc.baserulenumber;
            r.RuleName = adhoc.rulename;
            r.EffectiveDate = adhoc.effectivedate;
            r.Value = adhoc.value;

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

为了使用OpenExeConfiguration方法,其他DLL的配置文件需要与MSDN Reference中提到的可执行文件位于同一目录中。

您可能需要一个构建后事件来移动配置文件,但它确实有效。

您也可以使用Assembly.GetAssembly( MEF加载的某种类型 )。而不是Assembly.GetExecutingAssembly()。位置,取决于你如何使用它。

我有一个示例项目,我使用MEF加载部件,并读取他们的配置文件。

如果您仍有问题,请告诉我