0

我的项目中有自定义部分。以下行适用于 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,Culture=neutral”加载类型“Project.Models.Configuration.ProductSettings” , 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" />
4

1 回答 1

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。

于 2015-07-24T23:25:02.393 回答