【茶包射手專欄】艱辛的.NET 2.0之路

手上有個專案是承接了前人版本修改而成的,原本的專案是以.NET 1.1開發,用了不少自訂UserControl提高共用性,其中還應用了不少進階的寫法(甚至滿Hacking的),例如在Constructor中向MainForm Instance註冊,在Dispose中移除註冊等等。

由於我已經改用VS 2005很長一段時間了,回頭用VS.NET 2003寫了幾個星期,曾經滄海難為水,愈寫愈不是滋味,其中幾個我最不習慣的地方包含:

  1. 同時開啟多個Class編輯時,IDE只能顯示其中五六個Tab,畫面之外的只能用向左向右去找Tab,再不然要從選單的視窗清單中去選。相形之下,VS 2005在可以直接下拉顯示所有編輯中Class的清單,實在貼心。
  2. 寫Code輸入變數時,不會自動提示(Intellisense)區域變數名稱,常要向回捲去找。至於Class Members,也得也輸入"this."之後才有得提示。
  3. 由於是修改原有程式,動一個Method之前要先知道有多少地方呼叫到它。在VS.NET 2003中只能用"Go to Reference"一個個找,VS2005的Find All References就顯得價值連城。
  4. .NET 1.1沒有List<T>, Dictionary<T, T>的Generic可用,用ArrayList跟Hashtable每次都要轉型別,煩。
  5. 由於專案挺複雜的,每次啟動都要很久,少了VS 2005 Debugging Edit And Continue的功能,讓我在不斷修改->重新Debug間多白了好幾根頭髮。
  6. VS.NET 2003跟Office 2007內附的新中文輸入法處得不太好,偶爾在切成中文輸入時,IDE會整個Hang住,必須重開VS.NET 2003。這常發生在寫了數十行Code,最後發了佛心切到中文想寫個註解時,當死了~~~ 大哥,我還沒存檔呀! 好心寫中文註解還遭天譴,情何以堪哪~~~
  7. ... 唉! 罄竹難書 ...

吞忍了幾個星期後,終於忍不住了,狠下心來,想把它翻到.NET 2.0,就可以快快樂樂用VS 2005了。只是代誌不像憨人所想的哈尼甘單~~~

前面提了,原有專案用了一些進階的UserControl設計觀念,所以專案用VS 2005開啟後自動升級,轉換後的專案表面上可以執行,但苦難才開始:

幾個1.1版的3rd Party元件在2.0跑起來的顯示有破圖的現象,這在設法取得2.0版元件後獲得解決。

接著,我發現一個引用自訂UserControl的Form設計頁面,在開始Debug或關閉該設計頁面時,會出現可怕的錯誤導致元件整個設計頁面壞掉,訊息內容是Resize事件引發了Null Reference Exception,看來是UserControl的Designer(控制UserControl在IDE顯示樣子的部分)出了問題,但我沒有頭緒。反覆找了好幾天,除了確認UserControl是導致出錯的原因,一直沒什麼起色,我已經灰心到想放棄2.0,乖乖回去用1.1了。

今天早早起床決定再做垂死的掙扎,經過一夜的沈澱,思緒格外清晰,我注意到每次UserControl導致IDE出錯後,後面接連編輯了幾個其他Class功能都正常,但在關閉VS 2005時卻會發生整個VS 2005 Crash的情況,VS 2005會說它已產生了Memory Dump可送回MS分析並重新啟動程式。

為什麼UserControl的錯誤發生後,可以繼續編輯其他程式相安無事,卻在VS 2005關閉時引發致命錯誤呢?

反覆思索這個問題。有了!!! 是Garbage Collection機制嗎? UserControl的Designer物件在面頁關閉時並未真的結束,直到程式關閉時才觸發了Dispose? 而Dispose中的程式碼引發致命錯誤?

不確定自己的想法是否是正確,但驗證的方法很簡單,把Dispose中額外加入移除對MainForm Instance註冊的Code Remark掉,VS 2005就不當了,BINGO!!!!

證實了問題所在,要解決只是彈指的功夫! (記得國父御用水電工的故事嗎? 敲一下1元,知道敲哪裡99元。) 只需在Dispose Code前加上if (this.DesignMode)的判斷,避免在Designer階段觸發該段邏輯即可。(但很奇怪,同樣的寫法在VS.NET 2003中並沒有問題,或許是VS 2005這方面的容錯較低)

就這樣,花了近兩天的時間,逐步接近問題的核心,最後先從煩躁中抽身,冷靜思考再加上對.NET的基本知識(Garbage Collection & Dispose),終於柳暗花明。再會了VS.NET 2003,VS 2005我來了!!

歡迎推文分享:
Published 16 September 2007 02:11 AM 由 Jeffrey
Views: 13,778



意見

# 小熊子 said on 16 September, 2007 06:05 PM

Client 也是要安裝 net Framework 2.0

該痛的仍是要痛啊~

# Jeffrey said on 17 September, 2007 09:35 AM

哈! 敢升級就沒在怕的。

反正.NET 2.0遲早要變成OS的基本要求(甚至Vista內建2.0,沒有1.1,又多出了另一種不相容的問題),加上多了Windows Update的安裝管道當後盾,那就我不入地獄誰下地獄吧!

(這番話說得豪氣干雲,是因為部署是以後的事... 汗)

# Morris said on 17 September, 2007 10:06 PM

不好意思..整段有個地方不太懂..

就是.....國父御用水電工的故事 !!

這個是啥??

# Jeffrey said on 18 September, 2007 01:15 AM

To Morris:

嘿... 抱歉忘了可能會有代溝,水電工的故事是國父在孫文學說中引據詮釋"知難行易"的一個小例子。典故見這裡: http://zh.wikisource.org/wiki/%E5%BF%83%E7%90%86%E5%BB%BA%E8%A8%AD/%E7%AC%AC%E5%9B%9B%E7%AB%A0 最下面的一段。

# 好馬 said on 20 April, 2011 01:26 AM

敢問黑哥,茶包的由來?

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2007>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication