[英]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項目:
...
<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,版本= 4.0.0.0,文化=中性”中加載類型“ Project.Models.Configuration.ProductSettings” ,PublicKeyToken = b03f5f7f11d50a3a'。 無法從程序集“ System.Configuration,版本= 4.0.0.0,區域性=中性,PublicKeyToken = b03f5f7f11d50a3a”中加載類型“ Project.Models.Configuration.ProductSettings”。
從單元測試app.config引用此名稱時,為什么必須指定程序集名稱? 這解決了問題,但不確定為什么需要它。
<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />
這取決於執行代碼的主機。
無需額外檢查,您會發現在Configuration命名空間的內部工作中,將type
屬性輸入到靜態方法Type.GetType(string typeName)
。
對於typeName參數,您可以在其說明中找到:
如果類型在當前正在執行的程序集中或在Mscorlib.dll中,則只需提供其名稱空間限定的類型名稱即可。
關鍵部分是當前正在執行的匯編 。 對於普通的應用程序域,對於運行單元測試(我認為是VS)的應用程序,似乎從來都不是這樣。
另一方面,ASP.NET Web托管提供了一個內部HttpConfigurationSystem
類,該類重新實現了對GetSection
的調用。 很難理解,但看起來內部類BuildManager
會加載所有程序集並遍歷所有類型,以找到匹配的類型。
這解釋了行為上的差異。 建議始終指定程序集名稱。 在asp.net方案中,如果assemblyname存在於type參數中,則它會短路到Type.GetType
調用,從而阻止加載和檢查Webapp的bin文件夾中的所有dll。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.