文章目錄
I:關於如何Debug進MVC3原始碼.
1.關於ASP.NET MVC3的原始碼擷取方法
ASP.NET MVC從1.0到3.0版本以來它的原始碼是完全對外開放的,也正因為這個原因吸引了不少以前習慣使用WebForm的開發人員轉向研究MVC,在這裡也很”高興”各位IT業界內的朋友們不斷地向MS反饋資訊..才有了今天的MVC3版本號碼的出現..也不知下一個版本會.......
轉回原題它的原始碼託管在微軟的codeplex上,下面的串連為ASP.NET MVC的項目地址,大家可以很方便地擷取到它:
http://aspnet.codeplex.com/wikipage?title=MVC&referringTitle=Home
下載下來以後.我們查看一下原始碼包內的各各MVC組件的分布情況:
MVC3原始碼包檔案名稱為:mvc3-rtm-sources.zip
下面一圖介紹了MVC3中最主要的幾個程式集在原始碼包中的具體位置
2.下面開始介紹如何建立一個可Debug進MVC3原始碼的Visual Studio MVC項目
首先我們從VS2010建立一個空白的解決方案dotNetDR_MVC3_ExampleProject,然後在VS中關掉這個解決方案,接著把解決方案檔案複製到
mvc3-rtm-sources檔案夾(也就是你解壓MVC3原始碼檔案出來的那個位置,在這裡我的路徑比較長.我的位置是:
D:\SVN_WorkFolder\dotNetDR\Project\Code\mvc3-rtm-sources,各位朋友請根據自身實際情況進行相關操作).
然後依次添加如下MVC專案檔到我們所建立的空白解決方案當中,並且執行編譯,最終的方案總管圖為:
在此我電腦上面編譯期間一路順風順水!無Error無Warning!~_~....
接著我們建立一個名為WebApp的解決方案檔案夾然後添加一個名為MVC3_App1的建立MVC3項目.然後移除原來從GAC內引用過來的MVC3程式集,再添加引用本解決方案內當中的各個MVC3項目:
最後Mvc3_App1的情況為:
接著Web項目編譯是完成的.但是你啟動並執行話就悲劇了.因為本地程式集和GAC的程式集衝突了.
[A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' in the context 'Default' at location 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'. Type B originates from 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 'C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\7c2060f6\6145b34e\assembly\dl3\9036b7c7\fc8023c0_73fecb01\System.Web.WebPages.Razor.DLL'.
之前我曾有過卸載掉在GAC當中的MVC3程式集的想法,但最終因該程式集和Microsoft Windows Installer有關聯而無法用gacutil /uf來卸只能另尋其他辦法.
最後幾經折騰,終於明白了引起衝突的具體原因:
幸虧之前的做法嘗試失敗,真正的原因其實還是因為在Web Pages 1.0中他在web.config內新增了一個配置節點,我目前可以肯定的是開發人員可以根據需要而取消掉預設MVC3配置環境就在這個新增的節點當中.當然這要求開發人員比較深入地瞭解MVC3才行
Web Pages 1.0在Web.config中目前我已發現到新增了一個配置節點:
路徑在~/Views/web.config.而不是web.config.至於web.config能否使用?還有待研究.
<configuration> <system.web.webPages.razor /> <!--注意他於常用的system.web同級--> <system.web /> ...</configuration>
關於這個配置節點的說明目前我還沒找到MSDN上有具體的英文介紹.而只是能找到相關的類庫成員列表.而詳細的介紹說明還未完善.還得等待MS的文檔工作人員完善.~
接著我們可以開啟他並修改相關的PublicKeyToken為null.設定可以讓.NET Runtime引用我們解決方案中的未簽名MVC3原始碼項目而非用GAC當中引用.這樣的話可以解決掉之前出現的同名類型在不同的程式集中發生衝突的可能性.~這個特性也是.NET相比以前的XX(冒似是COM+這類,作者不太瞭解那個年代的東西)改進了同名不同版本的類庫衝突
下面進行修改我們的MVC3_App1項目內的~/Views/web.config檔案
<xml version="1.0"><configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"><!--這行要改--> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" requirePermission="false" /><!--這行要改--> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" requirePermission="false" /><!--這行要改--> </sectionGroup> </configSections> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" /> <!--這行要改--> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> </namespaces> </pages> </system.web.webPages.razor>...
接著修改~/web.config檔案
<configuration> <connectionStrings /> <appSettings> <add key="webpages:Version" value="1.0.0.0"/> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <!--這行要改--> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" /> <!--這行要改--> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </assemblies> </compilation> ... </system.web> ...</configuration>
在這裡我發現了有一處寫入程式碼了這個PublicKeyToken的地方:
位於項目System.Web.WebPages.Deployment中的PreApplicationStartCode.cs檔案Line 24:
待我深入瞭解好了.在向各位解釋這個常量的作用
修改完成以後我們設定相關斷點
斷點1置放位置 at System.Web.WebPages.Deployment項目根目錄內PreApplicationStartCode.cs Line:39
斷點2置放位置 at Mvc3_App1項目Controllers檔案夾下的HomeController.cs Line:12
再按F5去Debug一下MVC3_App1項目接著就可以順利地debug進去了.
為App初始化時走的流程,我以前寫的文章有介紹過WebPages脫離WebForms的運行方式,有興趣的可以去回顧一下那篇文章.
可以看到運行點已經到達了Action內了.這說明我們離成功非常接近了.
直接運行下去,看到了這一個藍頁已證明我們引用的所有MVC來源程式已經可以正常工作了,此時的你是否與博主一樣激動呢?
經過這一折騰,這一章節就算順利完成了,同時也為往後要瞭解MVC3內部工作原理開了一扇窗.