手上有個專案是承接了前人版本修改而成的,原本的專案是以.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我來了!!


Comments

# by 小熊子

Client 也是要安裝 net Framework 2.0 該痛的仍是要痛啊~

# by Jeffrey

哈! 敢升級就沒在怕的。 反正.NET 2.0遲早要變成OS的基本要求(甚至Vista內建2.0,沒有1.1,又多出了另一種不相容的問題),加上多了Windows Update的安裝管道當後盾,那就我不入地獄誰下地獄吧! (這番話說得豪氣干雲,是因為部署是以後的事... 汗)

# by Morris

不好意思..整段有個地方不太懂.. 就是.....國父御用水電工的故事 !! 這個是啥??

# by Jeffrey

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 最下面的一段。

# by 好馬

敢問黑哥,茶包的由來?

Post a comment