Managed Extensions for C++ 中的元件
以下是簡單字串元件在 Managed Extensions for C++ 中的樣子:
清單 1:Managed Extensions for C++ 中的元件 (CompVC.cpp)
#using <mscorlib.dll>
using namespace System;
namespace CompVC {
__gc public class StringComponent {
private:
String* StringsSet[];
public:
StringComponent() {
StringsSet = new String*[4];
StringsSet[0] = new String(L"Visual C++ String 0");
StringsSet[1] = new String(L"Visual C++ String 1");
StringsSet[2] = new String(L"Visual C++ String 2");
StringsSet[3] = new String(L"Visual C++ String 3");
}
String* GetString(int index) {
if ((index < 0) || (index >= StringsSet->Length)) {
throw new IndexOutOfRangeException();
}
return StringsSet[index];
}
__property int get_Count() { return
StringsSet->Length; }
};
};
前面曾提過,您必須使用 namespace 陳述式建立新的命名空間來封裝即將建立的類別:
namespace CompVC {
請注意,這個命名空間可為巢狀,而且可分成多個檔案。單一原始程式碼檔案也可包含多個非巢狀的命名空間。由於命名空間可包含 Managed 和 Unmanaged 類別 (Visual Basic 和 Visual C# 中的命名空間只能有 Managed 類別),因此您必須使用修飾詞 (Modifier) __gc 來指定 StringComponent 類別為 Managed:
__gc public class StringComponent {
這個陳述式表示 StringComponent 的執行個體現在將由 Common Language Runtime 建立,並且在記憶體回收堆積 (Heap) 中管理。您可能也已經使用 /CLR 編譯器參數,使程式中的所有類別成為 Managed,不論它們是否加了前置詞 __gc。
每次建立新類別執行個體時所執行的類別建構函式 (Constructor) 具有和類別相同的名稱,而且沒有傳回型別。
public:
StringComponent() {
以下是 GetString 方法,它會使用整數引數並傳回字串:
String* GetString(int index) {
...
return StringsSet[index];
}
GetString 方法中的 throw 陳述式會將 Runtime 的例外處理反白顯示:
throw new IndexOutOfRangeException();
這個陳述式會建立 IndexOutOfRangeException 型別的新物件,並擲回呼叫者所攔截到的例外狀況 (Exception)。請注意,.NET 例外處理要求所有例外狀況 (包括您定義給自己使用的例外狀況) 都必須從 System::Exception 衍生而來。
**注意 **這個錯誤處理機制會取代在前一版 COM 中所使用以 hResult 為基礎的機制。
最後,您會建立唯讀的 Count 屬性:
__property int get_Count { return StringsSet->Count; }
建置新的 Managed Extensions for C++ 元件比較複雜:
cl.exe /clr /Zi /c CompVC.cpp
link.exe -dll /debug /nod:libcpmt.lib kernel32.lib mscoree.lib /out:..\bin\CompVC.dll CompVC.obj
和簡單的 Hello World Managed Extensions for C++ 範例一樣,您需要用 /CLR 參數指示編譯器建立 .NET Managed 程式碼組件。
為了方便起見,會將這個教學課程的範例元件放在和原始程式碼相關的 ..\Bin 子目錄中。若要將編譯完的元件放在這個位置,只需使用 /out 參數指定完整檔名。如果要將編譯完的元件用在其他程式中,您也可以將其放在組件快取中。即使您指定的輸出檔具有 .dll 副檔名,還是需要用額外的 -dll 參數來建立 DLL,而非具有 .dll 副檔名的可執行檔。
請參閱
Visual C# 中的元件 | Visual Basic 中的元件 | 簡單元件的用戶端 | 開發教學課程摘要 | 附錄 A:瀏覽命名空間的工具