我已经了解了使用ConfigurationManager进行的自定义配置。由于某些原因,您必须在app.config的section元素中使用程序集引用,否则ConfigurationManager不会加载app.config。但是在ASP.NET应用程序中,这种方法可以正常工作。为什么?
请考虑以下自定义配置类:
namespace CustomConfiguration
{
class MySection : ConfigurationSection
{
[ConfigurationProperty("link", IsKey = true)]
public string Link
{
get => (string) this["link"];
set => this["link"] = value;
}
}
}
使用此app.config,我可以在程序中轻松获取myCustomSection的链接属性:
<configuration>
<configSections>
<section name="myCustomSection" type="CustomConfiguration.MySection, myAssembly" />
</configSections>
...
<myCustomSection link="link i can access in my code" >
</myCustomSection>
</configuration>
在app.config的section-element中删除程序集引用将导致ConfigurationErrorsException,因为ConfigurationManager无法在其自己的System.Configuration程序集中加载我的CustomConfiguration.MySection类。 例如:
<section name="myCustomSection" type="CustomConfiguration.MySection" />
但是Microsofts documentation说我应该可以做到。 实际上,我可以在ASP.NET应用程序中执行此操作。在节的type属性中不提供程序集名称仍然可行,并且system.configuration在正确的应用程序程序集中看起来很神奇。为什么?
答案 0 :(得分:0)
ASP.NET
托管环境具有不同的程序集加载行为;
它会在启动时加载所有引用的程序集(从bin
和GAC
开始)。
因此,CustomConfiguration.MySection
节的汇编可以自动解决,而无需在type
定义中指定。
如果您在web.config
文件中包含以下设置,则程序集myAssembly
将在初次启动时不再加载。
然后,还需要通过type
在CustomConfiguration.MySection, myAssembly
定义中指定装配零件。在这里,您将获得与非基于Web的应用程序相同的行为。
<configuration>
<!-- ... -->
<system.web>
<compilation>
<assemblies>
<remove assembly="myAssembly" />
</assemblies>
</compilation>
</system.web>
<!-- ... -->
</configuration>
您问题中的referenced documentation显示可以在app.config
文件(非基于Web的应用程序)中声明一个部分(如下所示),但这仅适用于外部盒子提供的配置类/处理程序,例如System.Configuration.SingleTagSectionHandler
,位于核心System
组件(System.dll
)中。
对于所有其他(自定义)部分,需要完整的程序集名称。
<configuration>
<configSections>
<section name="sampleSection"
type="System.Configuration.SingleTagSectionHandler" />
</configSections>
<sampleSection setting1="Value1"
setting2="value two"
setting3="third value" />
</configuration>