明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在設計期跟蹤代碼 (.NET)

[摘要]在開發(fā)中碰到這樣的問題:winform窗口中定義了基類窗體,在設計器中打開子類窗體的時候出現(xiàn)諸如“窗口無法使用設計器進行進行設計,發(fā)生了......的異!钡男畔,并且窗體無法打開,也就沒辦法使用窗體設計器進行界面的設計。但是運行起來一切正常。這個問題的原因就是在解決方案資源管理器中雙擊窗體打開進...
在開發(fā)中碰到這樣的問題:

winform窗口中定義了基類窗體,在設計器中打開子類窗體的時候
出現(xiàn)諸如“窗口無法使用設計器進行進行設計,發(fā)生了......的異!钡男畔,并且窗體無法打開,也就沒辦法使用窗體設計器進行界面的設計。但是運行起來一切正常。

這個問題的原因就是在解決方案資源管理器中雙擊窗體打開進行設計的時候,會去執(zhí)行它的基類,也就是父窗體中的一些代碼,例如:

建立一個基類窗體,名為FormBase,再建立一個子類窗體FormDerive,從FormBase繼承
public class FormDerive : FormBase
{
private System.ComponentModel.Container components = null;

public FormDerive()
{

InitializeComponent();
}
...........................
}

然后在基類窗體的構(gòu)造函數(shù)中加句代碼:
public FormBase()
{

InitializeComponent();

MessageBox.Show("It's Base Form!");
}

編譯,然后雙擊“解決方案資源管理器”中的FormDerive打開設計器,這時會先有一個MessageBox彈出,然后顯示FormDerive的設計界面。

現(xiàn)在來讓FormBase中的代碼發(fā)生異常,寫一個最簡單的產(chǎn)生“數(shù)組越界”的代碼

string[] array = new string[]{"1","2","3"};
for ( int i = 0; i <= array.Length ; i++ )
{
MessageBox.Show(array[i]);
}

再次打開設計器,彈出對話框后設計器一片空白,提示:
?試圖創(chuàng)建 WindowsApplication12.FormBase 的實例時發(fā)生異常。異常為“索引超出了數(shù)組界限。”
?
如果在FormBase的Load事件中插入導致異常的代碼,使用設計器時會出現(xiàn)同樣的現(xiàn)象。

如果基類中的代碼比較簡單,可以通過閱讀找到問題,那么代碼比較復雜呢?
現(xiàn)在才說到正題。

在.net中提供了一個調(diào)試工具DbgClr.exe,它可以在設計器進行代碼的跟蹤。
如果你找不到這個文件,可以使用“搜索文件”找到它。

下面就是怎樣使用DbgClr跟蹤:
運行DbgClr.exe
點擊菜單:工具-調(diào)試進程,會列出目前系統(tǒng)的進程。

選擇devenv.exe進程,也就是VS.net集成開發(fā)環(huán)境,點附加。關(guān)閉對話框。
在DbgClr中打開要調(diào)試的.cs文件,這里選擇FormBase.cs文件

然后在FormBase的構(gòu)造函數(shù)進行for循環(huán)的地方加上斷點。
重新打開FormDerive,這時會在DbgClr中中斷,可以進行調(diào)試了。

總結(jié):我碰到出現(xiàn)這種窗體打不開的情況重要是在讀取一些配置文件時產(chǎn)生的,就是在設計期指定的路徑下沒有指定的文件,但是在運行時使用生成后事件把文件拷貝過來,所以運行期沒問題。

這問題搞了我好半天吶,知道了調(diào)試的方法,再出現(xiàn)這問題就不怕了。

DbgClr.exe的使用在幫助里有講解,我以前怎么就沒有注意到呢:
.NET Framework->工具和調(diào)試器->CLR 調(diào)試器