我們知道VS開發中引用的程序集和運行時的程序集來源於不同的地方,前者來源於%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v{version},后者則來源於GAC。這可以從VS的添加引用對話框看出來。照理說兩者應該一直才對,但是你是否發現了它們之間存在着差異嗎?
這個問題是我昨天研究ASP.NET的路由系統時發現的,表示路由對象集合的RouteCollection原本如下兩個屬性AppendTrailingSlash 和LowercaseUrls,表示在對生成能夠的URL進行規范化時是否需要添加一個額外的“/”字符(如果不存在)以及是否需要將URL轉化成小寫。
1: public class RouteCollection : Collection<RouteBase>
2: {
3: //其他成員
4: public bool AppendTrailingSlash { get; set; }
5: public bool LowercaseUrls { get; set; }
6: }
但是當我試圖在代碼中使用這兩個屬性的時候,卻發生變異錯誤,提示RouteCollection並不具有這兩屬性。
那么唯一的解釋是VS引用的System.Web.dll中的該類型並不包含這兩個屬性,為此我通過Reflector從%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0中加載了該程序集。
其RouteCollection屬性確實不包括上述的兩個屬性。
然后我又從GAC中加載了System.Web.dll程序集。
這里定義的RouteCollection是具有上述的兩個屬性的: