詳解C#組件開發的來龍去脈
C#組件開發首先要了解組件的功能,以及組件為什么會存在。在Visual Studio .NET環境下,將會有新形式的C#組件開發。
組件的功能
微軟即將發布的 Visual Studio .NET 將使程序開發人員獲得一個集成開發環境,它不但為開發傳統的 C/C++ 應用程序,而且也為令人振奮的Microsoft .NET 組件提供了豐富的工具。這些以管理代碼編寫、在通用語言運行時構建的組件向開發人員提供了一個全新的混合開發環境,即象 Microsoft Visual Basic 一樣容易,而同時又提供了強大的低級編程能力,與 ATL 或 MFC 更加相關。隨著以生產效率為中心的管理環境的到來,它可與傳統 COM 組件很好地協同工作。開發人員可以將更多時間花在構建大型組件上,而不用再為內存泄漏、安全和頭文件擔心。
除了提供Microsoft .NET Framework組件的開發外,Visual Studio.NET (VS .NET) 還擁有很多工具,可以讓組件利用 VS .NET 中設計器架構的優勢來設計出在外觀和性能上與 VS .NET 所附帶組件相近的產品。在開發管理組件時,在 VS.NET 設計器中獲得的所有特性都使用組件本身的 .NET Framework,從而獲得設計時與運行時組件之間的緊密集成。
組件是什么
很顯然, Microsoft . NET Framework 組件很容易編寫。 讓它們與Visual Studio . NET 設計器一同工作的唯一要求是,它們實現 System.ComponentModel.IComponent,即通常表明繼承于IComponent的默認應用。IComponent使組件可跟蹤設計時的信息(如它的容器組件或名稱)或訪問設計器提供的服務。
讓我們編寫一個簡單的C#組件開發,它的形式如下:
- 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.NETWin 窗體設計器或組件設計器中,即可從屬性瀏覽器中看見它有名稱,也有一個稱為“Value”的屬性,使用下拉箭頭可以將值設置為True或False,當值在 True 和 False 之間切換時,可以觸發事件OnValueChanged。
對于設計器來說,組件只是我們要說明的一半,最重要的部分是屬性,它組成了元數據,元數據是關于類、屬性、事件等的信息。讓我們以Value屬性為例。僅作為屬性,就已經有相關的元數據了,例如類型(布爾)、行為(讀/寫)或名稱(“Value”)。使用“反射”對基本元數據進行檢索,即通用語言運行時允許用戶在運行時檢查對象的類型、基本類型、屬性、方法、構造器、字段和訪問級別。所有這些信息都被認為是元數據。
定制元數據
定制元數據包括可添加到類或類成員的任意信息段(字段、屬性或方法),實際上是類型本身被特定客戶所識別。對于Visual Studio .NET設計器來說,定制元數據構成所有可擴展性的基礎。VS .NET 設計器理解的所有元數據屬性都基于一名為System.ComponentModel.Member Attribute的類。它提供一個基本類,因此開發器所關心的屬性可以通過它們的類型快速標識。
通過一個典型實例可以更容易理解這一概念。比如我們不希望 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”的構造器,編譯器把這個元數據屬性綁定到該構造器并創建一個屬性類的實例。如果屬性類瀏覽器獲得了這個對象,它將枚舉出該對象的屬性并忽略“browsable”屬性,因為它以此屬性為標簽。因此看起來該對象沒有屬性。BrowsableAttribute 也可應用于事件。
Microsoft .NET Framework 擁有豐富的屬性集來控制設計器如何使用組件。這里是其中一些有用屬性的列表,使您在以后的閱讀中更能理解其含義:
屬性名 說明BrowsableAttribute控制屬性或事件是否顯示在屬性瀏覽器中。BindableAttribute確定屬性是否適合數據綁定器進行綁定。CategoryAttribute指定屬性在屬性瀏覽器中應分組的類別(“Appearance”,“Layout”, “Behavior”,“ Misc”等等)。DefaultEventAttribute/ DefaultPropertyAttribute 指定對象的默認事件或屬性。HelpAttribute 指定屬性或事件的幫助文件和主題。LicenseProviderAttribute 指向為組件提供許可證信息的 LicenseProvider。MergablePropertyAttribute 在屬性瀏覽器中當多個組件被瀏覽和選中時,允許或阻止包含某屬性。PersistableAttribute 確定在 Win Forms Designer 或 ComponentDesigner 等可視設計器中生成代碼時,屬性值是否應與代碼保持一致。PersistContentsAttribute確定代碼生成是否應回歸到對象的非數值類型屬性以及是否保持代碼與屬性值一致。ICollection 屬性類型是這一應用的典型示例。ShowInToolboxAttribute 確定是否允許在工具框中使用這一組件。ToolBoxItemAttriubte 指定從工具框中創建類時應使用的 ToolboxItem類型。
【編輯推薦】