为什么我必须在app.config中指定程序集,而不是在使用自定义部分时指定web.config

时间:2015-07-24 15:04:11

标签: c# c#-4.0 custom-sections

我的项目中有自定义部分。以下行适用于web.config中的Web API项目:

...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

当我运行单元测试时,出现以下错误:

  

System.Configuration.ConfigurationErrorsException:为Project.Models / product创建配置节处理程序时发生错误:无法从程序集'System.Configuration,Version = 4.0.0.0加载类型'Project.Models.Configuration.ProductSettings', Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。无法从程序集'System.Configuration,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'加载类型'Project.Models.Configuration.ProductSettings'。

为什么在从单元测试app.config引用它时必须指定程序集名称?这解决了这个问题,但不确定为什么需要它。

<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />

1 个答案:

答案 0 :(得分:1)

这取决于执行代码的主机。

如果没有额外的管道,您会发现在Configuration命名空间的内部工作中,type属性被输入静态方法Type.GetType(string typeName)

对于您在其说明中找到的typeName参数:

  

如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

关键部分是当前正在执行的程序集。对于普通 appdomains而言似乎永远不会出现这种情况,因此运行单元测试的应用程序(我假设是VS)也是如此。

另一方面,ASP.NET Web主机提供了一个内部HttpConfigurationSystem类,可以重新实现对GetSection的调用。这有点难以理解,但它看起来像内部类BuildManager加载所有程序集并迭代所有类型,以找到匹配的类。

这解释了行为上的差异。建议始终指定程序集名称。在asp.net场景中,如果程序集名称出现在类型参数中,它会短接到Type.GetType调用,这会阻止加载和检查webapp的bin文件夹中的所有dll。 / p>