visual 為 Microsoft Visual Studio .NET 設計工具建立可設計式元件
Shawn Burke
Microsoft Corporation 2000 年 7 月
摘要:Microsoft .NET 元件於通用語言執行階段,以管理程式碼撰寫建立而成。本文中討論 Microsoft .NET 元件如何提供開發人員一套全新的絕佳混合開發工具,不但類似於 Microsoft Visual Basic,同時提供與 ATL 或 MFC 更具關聯性的低階程式設計能力 (列印頁數共 26 頁)。
內容
簡介
元件範例
自訂中繼資料
瀏覽屬性
以相同方式出入:透過程式碼儲存元件
元件設計工具
使用設計工具服務與基礎架構
元件授權
結論
簡介
Microsoft 即將推出的 Microsoft Visual Studio® .NET 版本,可帶給開發人員整合式的環境,不僅為傳統 C/C++ 應用程式,同時也為全新的 Microsoft .NET 元件提供豐富的配備。這些新元件是利用管理程式碼撰寫,並於通用語言執行階段建立,可提供開發人員一套全新的絕佳混合開發工具,不但類似於 Microsoft Visual Basic,同時提供與 Active Template Library (ATL) 或 Microsoft Foundation Class (MFC),更具關聯性的低階程式設計能力。以產能為中心目標的控管環境,可以在傳統 COM 元件之間輕鬆地互動運作,它的出現也讓開發人員可以花更多的時間來建立大型元件,並減少對於記憶體遺漏、安全性和標頭檔的疑慮。
Visual Studio .NET (VS .NET) 除了提供 Microsoft .Net Framework 元件的開發設計之外,還有許多配備可讓元件充份利用 VS .NET 中的設計工具架構,讓其外觀和行為與 VS .NET 隨附的元件相似。在 VS .NET 設計工具中,您會發現所有開發管理元件的功能,皆使用 .Net Framework 元件本身,並允許設計階段及執行階段元件緊密整合。
元件範例
Microsoft .Net Framework 元件其實相當容易撰寫。如需與 Visual Studio .NET 設計工具執行,其惟一的條件是實行 System.ComponentModel.Component 所衍生的 System.ComponentModel.IComponent,也就是 IComponent 的預設實作。IComponent 可讓元件追蹤設計階段的資訊,諸如容器元件、名稱,或存取設計工具的服務。
舉例來說,我們撰寫類似下列之簡易 .NET 元件:
using System;
using System.ComponentModel;
public class BoolTracker : Component {
private bool state;
private EventHandler handler;
private static object EventValueChanged = new object();
public BoolTracker() {
}
public bool Value {
get {
return state;
}
set {
if (this.state != value) {
this.state = value;
OnValueChanged(new EventArgs());
}
}
}
public void AddOnValueChanged(EventHandler h) {
handler = (EventHandler)Delegate.Combine(handler, h);
}
public void RemoveOnValueChanged(EventHandler h) {
handler = (EventHandler)Delegate.Remove(handler, h);
}
}
很明顯的,這項元件的功用並不大,但如果將它置於 Visual Studio .NET Win 表單設計工具或者元件設計工具上,可以在瀏覽屬性中看到它的名稱,以及名為 Value 的屬性,其中的下拉式箭頭可將該值設定為「真」或「偽」。當該值介於「真」和「偽」之間時,則可觸發名為 OnValueChanged 的事件。
在設計工具中,元件往往僅佔成功的一半;最重要的部份則是組成中繼資料的屬性。中繼資料是有關於類別、屬性和事件等資訊。以 Value 屬性為例,屬性本身已經有相關聯的中繼資料,例如類型 (布林值)、行為 (讀/寫),或名稱 (Value)。基本的中繼資料使用「反映」來擷取,「反映」也是通用語言執行階段允許使用者在執行階段時期,就其類型、基本類型、屬性、方法、建構函式、欄位或存取層級來檢查物件的方式。所有此類的資訊皆視為中繼資料。
自訂中繼資料
自訂中繼資料包含可附加於類別或者類別成員 (欄位、屬性或方法) 的部分自訂資訊,而這些資訊的類型通常可由特定客戶端分辨出來。在 Visual Studio .NET 設計工具中,自訂中繼資料為其中所有的可擴充性奠定基礎。而所有 VS .NET 設計工具能夠理解的中繼資料屬性,則是以 System.ComponentModel.MemberAttriubute 類型為基礎。該類型提供基礎類別,讓相關的設計工具可以藉由類型來快速識別出屬性。
不妨以具體的範例說明讓您更容易瞭解。舉例來說,我們不希望 Value 屬性顯示於瀏覽屬性中;此時可新增名為 System.ComponentModel.BrowsableAttribute 的中繼資料屬性,以便控制是否可瀏覽某項屬性。
[Browsable(false)]
public bool Value {
get {
return state;
}
set {
if (this.state != value) {
this.state = value;
OnValueChanged(new EventArgs());
}
}
}
public override void PaintValue(
ITypeDescriptorContext context,
object value,
Graphics canvas,
Rectangle rectangle) {
if (value is Color) {
Color color = (Color)value;
SolidBrush b = new SolidBrush(color);
canvas.FillRectangle(b, rectangle);
b.Dispose();
}
}