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

Why do I have to specify the assembly in my app.config but not for my web.config when using custom sections

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

1
2
3
4
5
6
7
8
...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

当我运行单元测试时,我得到以下错误:

0

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

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

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

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

对于typename参数,您可以在其描述中找到:

0

关键部件当前正在执行程序集。对于普通的AppDomain,以及运行单元测试的应用程序(我假设为vs),这似乎从来就不是这样。

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

这就解释了行为上的差异。建议始终指定程序集名称。在ASP.NET场景中,如果类型参数中存在assemblyname,则它会对Type.GetType调用短路,从而阻止加载和检查webapp的bin文件夹中的所有dll。