在開發中碰到這樣的問題:
winform視窗中定義了基類表單,在設計器中開啟子類表單的時候
出現諸如“視窗無法使用設計器進行進行設計,發生了......的異常”的資訊,並且表單無法開啟,也就沒辦法使用表單設計器進行介面的設計。但是運行起來一切正常。
這個問題的原因就是在方案總管中雙擊表單開啟進行設計的時候,會去執行它的基類,也就是父表單中的一些代碼,例如:
建立一個基類表單,名為FormBase,再建立一個子類表單FormDerive,從FormBase繼承
public class FormDerive : FormBase
{
private System.ComponentModel.Container components = null;
public FormDerive()
{
InitializeComponent();
}
...........................
}
然後在基類表單的建構函式中加句代碼:
public FormBase()
{
InitializeComponent();
MessageBox.Show("It's Base Form!");
}
編譯,然後雙擊“方案總管”中的FormDerive開啟設計器,這時會先有一個MessageBox彈出,然後顯示FormDerive的設計介面。
現在來讓FormBase中的代碼發生異常,寫一個最簡單的產生“數組越界”的代碼
string[] array = new string[]{"1","2","3"};
for ( int i = 0; i <= array.Length ; i++ )
{
MessageBox.Show(array[i]);
}
再次開啟設計器,彈出對話方塊後設計器一片空白,提示:
試圖建立 WindowsApplication12.FormBase 的執行個體時發生異常。異常為“索引超出了數組界限。”
如果在FormBase的Load事件中插入導致異常的代碼,使用設計器時會出現同樣的現象。
如果基類中的代碼比較簡單,可以通過閱讀找到問題,那麼代碼比較複雜呢?
現在才說到正題。
在.net中提供了一個調試工具DbgClr.exe,它可以在設計器進行代碼的跟蹤。
如果你找不到這個檔案,可以使用“搜尋檔案”找到它。
下面就是怎樣使用DbgClr跟蹤:
運行DbgClr.exe
點擊菜單:工具-調試進程,會列出目前系統的進程。
選擇devenv.exe進程,也就是VS.net整合式開發環境,點附加。關閉對話方塊。
在DbgClr中開啟要調試的.cs檔案,這裡選擇FormBase.cs檔案
然後在FormBase的建構函式進行for迴圈的地方加上斷點。
重新開啟FormDerive,這時會在DbgClr中中斷,可以進行調試了。
總結:我碰到出現這種表單打不開的情況重要是在讀取一些設定檔時產生的,就是在設計期指定的路徑下沒有指定的檔案,但是在運行時使用產生後事件把檔案拷貝過來,所以運行期沒問題。
這問題搞了我好半天呐,知道了調試的方法,再出現這問題就不怕了。
DbgClr.exe的使用在協助裡有講解,我以前怎麼就沒有注意到呢:
.NET Framework->工具和調試器->CLR 調試器