我的项目中有自定义部分。以下行适用于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" />
答案 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>