URL:http://www.cnblogs.com/JeffreyZhao/archive/2007/02/06/ASP_NET_AJAX_Debugging_Project.html
雞肋般的源碼
ASP.NET AJAX的原始碼的確發布了,並且提供了pdb檔案,也就是說,我們現在可以用它來調試了。
但是它真的夠用嗎?不知道各位朋友們有沒有真的用它跟蹤到代碼中去,至少我用下來之後非常的不滿意。
- 代碼分散在每個檔案中,IDE的Go to Definition等功能無法使用。
- 代碼檔案不能有絲毫修改,否則pdb裡面記錄的行號就無法與原始碼對應。
- 在調試時查看對象的屬性或成員時,經常會遇到如下的提示:“Cannot evaluate expression because the code of the current method is optimized.”,而無法查看屬性或成員地值。
其中最後一個問題最為關鍵,它嚴重阻礙了調試過程。可是這又有什麼辦法呢?在編譯好的程式集裡MSIL都得到了最佳化,它已經不是元檔案直接編譯的結果了。
現在的原始碼真是雞肋。
雞肋也能烹制美味
誰說雞肋不能烹制美味?
官方給出了原始碼,我們為什麼不設法把它恢 複成C#工程呢?於是我建立了一個C# Class Library,把原始碼複製到工程中去。然後通過比較編譯錯誤、運行錯誤以及使用.NET Reflector查看ASP.NET AJAX程式集,一點點補充丟失的資源和代碼,費了九牛二虎之力總算比較完美地恢複了ASP.NET AJAX的程式集。
享用這道美食的方法也非常簡單,您只需要做以下幾步就可以了:
- 點擊這裡下載工程檔案和Web.config檔案。
- 將壓縮包解開,將System.Web.Extensions工程引入到您的解決方案中去。
- 為解決方案裡必要的工程添加一個剛才新增的System.Web.Exetensions工程的引用,並刪除對GAC裡System.Web.Extensions.dll的引用。
- 修改Web.config,將所有的“, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”去除,您可以對照著壓縮包裡的Web.config檔案進行編輯,或者直接使用這個文 件。
- 重新編譯。
現在,ASP.NET AJAX已經成為您解決方案中的一個工程了,您可以任意修改它,任意對它進行調試。當調試完畢後,去除對於這個工程的引用,並且重新添加GAC裡System.Web.Extensions.dll的引用即可。
享受美味時的注意事項
目前這個工程有些問題可能需要注意一下:
1、調試工程與GAC裡的System.Web.Extensions.dll不能同時引用
為了調試時不修改您的任何代碼,我保留了調 試工程裡所有原始碼不變,這導致了如果一個工程裡同時引用了GAC裡的System.Web.Extensions.dll和調試工程,則在編譯時間會出現 命名空間衝突的錯誤。這似乎是一個無法解決的問題,不過調試工程和GAC裡的程式集幾乎完全一樣,您也可以完全使用調試工程進行開發,發布時重新編譯一 次,並將Web.config改回來即可。
2、資源檔名稱以及相關代碼有輕微改變
由於使用了VS進行編譯(使用命令列編譯可 以解決這個問題,但是就不容易調試使用了),因此資源檔的名稱不得不進行了改變,例如MicrosoftAjax.js改成了 System.Web.MicrosoftAjax.js。相應的,由於源檔案中hard-coded了這個檔案名稱,因此我也對它進行了修改。這導致了如 果您的程式需要識別這些檔案名稱時,在使用調試工程時也需要修改一下您的代碼。例如在我之前的文章《ScriptManager的ResolveScriptReference事件的重要作用》中,我會判斷程式集是否引用了程式集裡名為MicrosoftAjax.js的檔案,現在就要判斷是否引用了名為System.Web.MicrosoftAjax.js。
另外, System.Web.UI.WebResourceUtil類的私人方法 SystemWebExtensionsContainsWebResource會用來教驗資源檔是否存在,我現在把它改為直接return true,將判斷的邏輯短路。這段代碼是為了在開發人員惡意訪問System.Web.Extensions.dll程式集裡不存在的資源時拋出合理的異 常,我們正常使用ASP.NET AJAX時不會受到這個修改的影響。
在幾乎所有情況下,這些輕微改變都不會造成使用上的問題。
3、控制項的表徵圖沒有編譯進程式集
控制項的表徵圖沒有編譯進入程式集,這樣調試用工程裡的控制項,如UpdatePanel在工具列中不會出現表徵圖。這不會對使用有任何影響,反而可以與GAC裡的UpdatePanel進行區分。
4、使用Ajax Control Toolkit時需要重新編譯
如果您需要把Ajax Control Toolkit和調試工程同時使用時,您也需要把Ajax Control Toolkit的源檔案引入到您的解決方案中,並修改它的引用,使它使用我們調試用的工程。最後需要重新編譯,產生新的程式集。
5、調試工程的UpdatePanel沒有設計期支援
要有設計期的支援似乎還需要配合Design源碼,我會儘快解決這個問題。