Managed Extension for C++
C++ 托管擴充 (Managed Extensions for C++) 對Microsoft Visual C++語言進行擴充可以生成.NET代碼,這些擴充稱為C++.NET托管擴充。C++是惟一一種可以在同一個源檔案中混合.NET代碼和非托管代碼的語言,是真正的.NET系統語言。 C++托管擴充是微軟為了讓Visual C++可以支援托管的引用程式的開發而對傳統C++語言進行的擴充,是新一代Visual C++開發工具的語言核心。 C++引入托管擴充的原因是既可以保持與原有C++特性的充分相容;又可以提供足夠的對.NET應用開發的支援 托管C++應用程式開發之概述 1、什麼是托管C++ 托管是.NET的一個專門概念,它倡導一種新的程式設計理念,是以我們完全可以把“托管”視為“.NET”。由托管概念所引發的C++應用程式包括托管代碼、托管資料和托管類三個組成部分。 托管代碼 .Net環境提供了許多核心的運作(RUNTIME)服務,比如異常處理和安全政策。為了能使 用這些服務,必須要給運作環境提供一些資訊代碼(中繼資料),這種代碼就是托管代碼。所有的C#、VB.NET、JScript.NET預設時都是托管的, 但Visual C++預設時不是托管的,必須在編譯器中使用指令行選項(/CLR)才能産生托管代碼。 托管資料 與托管代碼密切相關的是托管資料。托管資料是由公共語言運作的垃圾回收器進行配置設定和釋放的數 據。預設情況下,C#、Visual Basic 和 JScript.NET 資料是托管資料。不過,通過使用特殊的關鍵字,C# 資料可以被标記為非托管資料。Visual C++資料在預設情況下是非托管資料,即使在使用 /CLR 開關時也不是托管的。 托管類 盡管Visual C++資料在預設情況下是非托管資料,但是在使用C++的托管擴充時,可以使用“__gc”關鍵字将類标記為托管類。就像該名稱所顯示的那樣,它表示類實 例的記憶體由垃圾回收器管理。另外,一個托管類也完全可以成為 .NET 架構的成員,由此可以帶來的好處是,它可以與其他語言編寫的類正确地進行互相操作,如托管的C++類可以從Visual Basic類繼承等。但同時也有一些限制,如托管類隻能從一個基類繼承等。 需要說明的是,在托管C++應用程式中既可使用托管類也可以使用非托管類。 在托管C++中,托管類和非托管類是可以互相使用各自的特征,但托管類能夠封裝.NET架構中的元件,且最大限度地使用.NET架構中的特性,而傳統的C++類是使用MFC和ATL來設計的,用來編制基于Windows環境的應用程式。 2、為什麼使用托管C++ 除了可以充分發揮.NET架構新特性外,使用托管C++還有下列好處: (1) 由于在同一個應用程式中,甚至是同一個檔案中,我們可以同時使用托管C++和傳統的非托管C++來編寫,因而我們可以充分利用兩種C++所帶來的好處,并且可将代碼群組件快速移植到.NET架構中。 (2) 使用托管可以從任何一個.NET架構相容語言中調用一個C++元件,也可調用非托管DLL、其它庫以及類等。 (3) 可以直接從非托管代碼中通路.NET架構。 總而言之,使用托管C++是C++程式員編寫.NET架構應用程式最好的一種選擇,在充分了解.NET架構基礎上,避免了使用其他語言如C#、VB.NET所帶來的額外開銷。 為什麼使用C++托管擴充 微軟既要考慮Visual C++的相容性,又要讓傳統C++語言具備足夠的能力開發.NET應用程式,于是在新版本的Visual C++中,引入了C++托管擴充。 在整個Visual Studio開發套件中,微軟為了迎合.NET應用程式開發模式的要求,幾乎對每個工具都作了或大或小的改進。其中,VB的變革力度應用微軟各種軟體産品 之最。但是太大的變革往往會帶來相容性問題,特别是新版本的VB宣稱其隻能開發托管的應用程式(也就是.NET應用程式),是以對開發人員來講,這肯定意 味着過去使用VB編寫的代碼在新版本VB上進行重新構造的難度會很大。VB以前就在版本相容性方面有着不如人意的曆史—— 在VB4、VB5、VB6之間進行更新,會讓開發人員付出很多辛苦。現在,由于VB的體系進行了很大的改動,是以版本相容性問題會更嚴重一些—— 筆者已經在微軟幾個官方讨論組中看到了一些開發人員和相關人士對此表示出來的擔憂,并看到不止一個開發人員對新版本VB在相容性方面存在問題提出質疑甚至 是批評。 作為微軟開發套件中的另一位“元老”—— Visual C++,我們對其提供完整的.NET開發支援感到高興的同時也同樣擔心它的版本相容性問題—— Visual C++該不會也和VB一樣,徹底與MFC和ATL分裂吧?答案是:不可能! 這是一個令人振奮的回答,下面就讓我們花一點時間來了解新版本Visual C++是怎樣處理變革和向下相容之間的關系的。 另外,之是以微軟對VB進行那樣大的改革,是因為微軟認為VB通常适用于快速應用程式領域,這 些領域一般包含對效率要求不是很高的資料庫前端應用程式或後端業務元件。當更為優秀的.NET架構釋出之後,微軟就為VB換了換“心髒”,以期大幅度增強 VB的功能,使之成為快速開發.NET應用程式的主力軍。而對于Visual C++這樣一個在許多傳統領域依然寶刀不老的工具,當然不能急躁冒進,将已有的功能丢棄。是以,在新版本的Visual C++中,采用了一種更為折衷的方法—— 擴充現有C++語言,讓Visual C++在編寫純粹的.NET應用程式的同時,依然可以利用其成熟的技術進行未托管的應用程式的開發。 C++托管擴充是一個對現行C++語言進行擴充的集合,這個集合可以幫助Visual C++的開發人員編寫.NET Framework應用程式。由于是對語言做了擴充,而不是徹底去掉原先C++語言的功能,是以在托管擴充中,開發人員可以在同一個應用程式中混合使用傳 統未托管的代碼和新型的托管的代碼。這樣做得到的一個直接好處是,應用程式既可以享受未托管的代碼特性也可以享受托管的代碼特性。對元件開發也是一樣,傳 統元件可以很容易被包裝(wrapper)成.NET 架構元件,充分保障已有工作的投資。 在實際工作中,如果開發人員遇到下列開發需求,使用托管擴充将是最佳選擇: ● 需要快速地将未托管的C++應用程式合并到.NET架構中 對于以前開發的傳統未托管的C++應用程式,因為開發人員可以在同一個應用程式中(甚至是在同一個檔案中)混合使用兩種類型的代碼,是以托管擴充為實作兩種代碼的無縫轉化提供了一種平滑的轉化方式。 開發人員可以繼續使用未托管的C++來編寫元件,以利用語言本身強大的功能和靈活性。然後,為了讓.NET 架構應用程式順利通路這個傳統元件,開發人員可以使用托管擴充編寫一個很小的、轉換效率很高的包裝(wrapper)程式。 ● 需要讓任何一種與.NET架構相容的語言可以通路C++元件 托管擴充支援從任何.NET 架構相容語言來調用C++類。調用之是以可以實作,是因為使用托管擴充可以編寫簡單的包裝類來對通路方暴露對應的C++類和方法。這些包裝類都是托管的, 并可以從其他.NET架構相容程式中進行調用。在調用過程中,外包類在托管的類和未托管的類之間扮演了映射層的角色—— 它讓方法調用直接傳遞到未托管的類中。另外,需要特别指出的是,托管擴充支援對任何未托管的DLL或庫的調用。 ● 需要從未托管的代碼中通路.NET架構類 為了得到更多的功能,在未托管的代碼中,可以通路.NET 架構中的類。使用托管擴充,可以從C++代碼中直接建立、調用一個.NET 架構類。在實際程式設計中,可以像處理普通未托管的C++類一樣對待對托管的類的處理。另外,在.NET架構中提供了對未托管的COM的調用支援,可以編寫未 托管的代碼直接通路。 因為托管的代碼和未托管的代碼各有優點,在實際工作中,開發人員可以根據項目的實際情況,靈活 選擇兩者的使用。在某些追求通路效率的情況下,通過.NET 架構提供的COM接口進行通路可以收到比較好的運作效果;而在某些需要快速完成任務的情況下,利用.NET 架構提供的簡便性進行工作會讓開發人員倍感輕松。 托管C++并非獨立存在的程式設計語言,而僅僅是微軟對C++的一個文法擴充,允許C++程式員 在.NET架構和CLR的基礎上進行托管程式設計。與C#和Visual Basic .NET相比,其主要優點是舊代碼可以比較快地移植到新的平台上,而且即使不完全重寫代碼,也可以通過互操作在同一個子產品中無縫整合托管和非托管代碼,從 新的.Net架構中獲益。.Net架構封裝了大量的API,例如網絡通路、字元串操作、資料通路、XML服務、圖形界面控件庫、郵件服務、加密服務、檔案 輸入/輸出,甚至是WMI管理,也使得應用程式員可以編寫更加簡潔的代碼。目前隻有托管C++及其後繼者C++/CLI可以做到無縫整合托管和非托管代 碼,而在托管代碼中調用COM的速度又相當慢,是以經常被用于其他語言和非托管代碼之間的橋梁。 托管C++允許程式員編寫托管代碼,記憶體管理的工作現在可以讓CLR去自動處理,通路時也增加 了類型檢查,減少了緩沖區溢出和記憶體洩漏的危險,增加了程式的穩定性,但是在性能敏感的應用中,龐大的.NET架構和緩慢的自動記憶體管理并不是必要的,傳 統非托管代碼仍然是一些人的首選。