要知道C++/CLI是什麼,首先知道什麼是CLI。
一、CLI簡介
CLI:(Common Language Infrastructure,通用語言框架)提供了一套可執行代碼和它所運行需要的虛擬執行環境的規範。更通俗的我們可以說它是一個虛擬平臺,是操作系統和應用程序間的一層抽象。微軟的.NET的基礎CLR(Common Language Runtime,通用語言運行時)就是CLI的一個實例。
CLI主要的組成部分有:CTS,Metadata,CLS和VES。
★ CTS(Common Type System,通用類型系統):是CLI的基礎,它是一個類型規範,定義了所有CLI平臺上可以定義的類型的集合,所有基於CLI的語言類型都是CTS的一個子集,目前C++/CLI是對CTS描述支持最好的高級語言。
★ Metadata(元數據):用來描述和引用CTS定義的類型,元數據以一種獨立於任何語言的形式存儲,正是元數據賦予了組建自描述的能力。
★ CLS(Common Language Specification,通用語言規範):是用以確保所有CLI語言能夠互操作的一組規則,它定義了所有CLI語言都必須支持的一個最小功能集(一個CTS的子集)。各CLI語言可以選擇自己對CTS的一部分的映射,但是爲了確保不同語言的交互,至少應該支持CLS所定義的最小功能集。
★ VES(Virtual Execution System,虛擬執行系統):爲CLI程序提供了一個在各種可能的平臺上加載和執行託管代碼的虛擬機環境,只是一個規範,比如微軟和momo就各有自己的實現。.NET的CLR的JIT和GC應該屬於此範圍。
.NET Framework是微軟對CLI的一個實現,當然也是目前最好的實現,.NET Framework主要包含CLR和BCL,CLR(實時通用語言)是核心也即CLI的實現,BCL是一套通用的代碼庫,可以被所有的.NET語言(C#, VB.NET, C++/CLI)程序所使用。Visual C++2005是C++/CLI的實現。
二、什麼是C++/CLI
其實C++/CLI除了包含ISOC++和CLI擴展,它之所以強大的更重要的原因就是它實現了ISOC++和.NET的無縫連接。C++/CLI支持對本地ISOC++編程和.NET託管編程的無縫集成,不是簡單的混合,不僅能夠像.NET調用windows API一樣通過P/Invoke來實現函數互調,而且可以實現類型class級和ISOC++和.NET類庫的相互使用,更強的是能夠實現類型的混合。爲了實現無縫連接,絕大多數的以前的ISO C++代碼編譯後將得到託管代碼,部分不能編譯爲託管IL的採用P/Invoke調用實現。代碼託管,但是數據並不託管,原來ISOC++中本地堆內的數據仍位於本地堆中。
C++/CLI(CLI:Common Language Infrastructure)是一門用來代替C++託管擴展(下文使用MC++指代)新的語言規範。重新簡化了C++託管擴展的語法,提供了更好的代碼可讀性。和微軟.NET的其他語言一樣,微軟向ECMA提交了C++/CLI的標準。C++/CLI現在可以在Visual C++ 2005上開發。C++/CLI的部分特性已經申請了專利。
三、C++/CLI給我們提供了什麼?
① 優雅流暢的語法和文法--C++/CLI爲C++開發人員書寫託管代碼提供了一種非常自然的感覺,並且它提供了非託管代碼到託管代碼的平滑過度。以前所謂的"雙重底線"問題現在已經蕩然無存。
② 一流的CLI支持--CLI特色,例如屬性、碎片集合和屬類得到了直接支持,此外,C++/CLI還准許將這些特色用於本地非託管的類。
③ 一流的C++類支持--C++特色,例如模板和析構函數對於拖管和非拖管類繼續有效。實際上,C++/CLI是你可以"表面上"在棧或C++本地堆上聲明一個.NET類型唯一的.NET語言。
④ 在.NET與C++之間的溝壑上架起了一座橋樑--C++開發人員在抨擊BCL時不再象離開水的魚。
⑤ C++/CLI編譯器產生的可執行文件完全是可校驗的。
四、使用C++/CLI我們可以做什麼
可以簡單的從它所包含的三部分內容來解釋:
① ISOC++是C++/CLI對CLI擴展的基礎,C++/CLI對以前的ISOC++部分完全進行了保留,完全兼容,所以ISOC++可以做的,現在C++/CLI仍然可以繼續,那有人說這個就是ISOC++,那麼我也告訴你是C++/CLI, 因爲它是被編譯爲IL代碼,這時我們可以用來開發遊戲和圖形處理軟件等,但是如果是要開發系統或底層,這時需要將代碼編譯爲本地代碼,其實這時的C++/CLI就是ISOC++了;
② 對CLI的.NET實現的擴展,這部分我們可以充分地使用.NET所帶來的優勢,比如龐大的類庫和高效的UI快速開發能力;
③ ISOC++和.NET的集成,通過這部分,更好地補充了以前的本地代碼和.NET代碼的交互的能力,降低的集成的難度,使得可以更加充分地利用各語言和開發人員的優勢。
五、學習C++/CLI所需要的基礎
C++/CLI包含了ISOC++和對其的.NET的擴展,看這兩部分,一個是ISOC++,另一個是在.NET的擴展,可見基礎就是ISOC++,這也正是我這裏指出的本系列所要求的基礎。
前面雖然提到C++/CLI包含ISOC++和其擴展,但是考慮到ISOC++是個很大的內容和已經存在有大量的書籍介紹,所以本系列着重介紹ISOC++對.NET的擴展部分。
C++/CLI:是靜態C++對象模型到CLI的動態組件對象編程模型的捆綁,或者說C++/CLI是ISOC++在.NET的擴展,是ISOC++和.NET的無縫結合。簡而言之,它就是你如何用C++在.NET中編程,而不是C#或Visual Basic.NET。