日期:2008-11-30  浏览次数:20376 次

為 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);
}

protected virtual void OnValueChanged(EventArgs e) {
if (handler != null) {
handler(this, e);
}
}

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());
}
}
}


在指定屬性時,若將 BrowsableAttribute 縮寫為 Browsable,則 C# 編譯器會自動加入 Attribute。唯一的限制條件,就是如果有指定的屬性值,必須在屬性類型中對應到建構函式,且該值必須為常數。在本範例中,BrowsableAttribute 有一個佔用單一布林參數的建構函式 browsable,且編譯器將本中繼資料屬性繫結到該建構函式,並建立出屬性類別的實例。倘若瀏覽屬性取得本物件,將在物件中列舉各項屬性並忽略本屬性,原因是該瀏覽屬性已採用本屬性為標記。這樣看起來好像是沒有屬性的物件。BrowsableAttribute 亦可套用到事件。

Microsoft .Net Framework 包含豐富的屬性組合,可控制設計工具與元件之間的配合運作方式。在下列清單中,包括許多有用的屬性,在您深入閱讀及了解後將發現更多的功用:

屬性名稱
描述

BrowsableAttribute
無論是控制屬性或事件都會顯示於瀏覽屬性中‧

BindableAttribute
判斷資料繫結者所繫結的屬性適當與否。

CategoryAttribute
指定在瀏覽屬性中應分類至何種類別 (「外觀」,「配置」,「行為」,「雜項」等等)。

DefaultEventAttribute/ DefaultPropertyAttribute
指定物件的預設事件/屬性。

HelpAttribute
指定屬性或事件的說明檔和主題。

LicenseProviderAttribute
指出可提供元件授權資訊的 LicenseProvider。

MergablePropertyAttribute
在瀏覽屬性中已選取和瀏覽多重元件時,可允許或避免包含屬性。

PersistableAttri