C++ マネージ拡張でのコンポーネント
C++ マネージ拡張では単純な文字列コンポーネントがどのように記述されるかを次に示します。
リスト 1. 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 {
この名前空間は、入れ子にすることができ、複数のファイルに分割できます。また、1 つのソース コード ファイルに、入れ子になっていない複数の名前空間を格納することもできます。マネージ クラスだけを含む Visual Basic や Visual C# の名前空間とは異なり、C++ マネージ拡張の名前空間にはマネージ クラスもアンマネージ クラスも含むことができるため、修飾子 __gc を使用して StringComponent クラスをマネージ クラスとして指定します。
__gc public class StringComponent {
このステートメントは、StringComponent のインスタンスが共通言語ランタイムによって作成され、ガベージ コレクション ヒープで管理されることを示します。また、/clr コンパイラ スイッチを使用して、プログラム内のすべてのクラスを、その先頭に __gc が付いているかどうかに関係なくヒープで管理することもできます。
このクラス コンストラクタは、クラスの新しいインスタンスが作成されるたびに実行され、そのクラスと同じ名前を持ち、戻り値の型はありません。
public:
StringComponent() {
整数を受け取って文字列を返す GetString メソッドを次に示します。
String* GetString(int index) {
...
return StringsSet[index];
}
GetString メソッド内の throw ステートメントは、ランタイム ベースの例外処理を示しています。
throw new IndexOutOfRangeException();
このステートメントは、型 IndexOutOfRangeException の新しいオブジェクトを作成して例外をスローします。この例外は、呼び出し元によってキャッチされます。.NET の例外処理では、独自の用途に合わせて定義された例外を含め、すべての例外が System::Exception から派生した例外であることが要求されます。
**メモ **COM の以前のバージョンで使用されていた hResult に基づくエラー処理機構は、この機構に置き換えられます。
最後に、読み取り専用の Count プロパティを次のように作成します。
__property int get_Count { return StringsSet->Count; }
新しい 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
C++ マネージ拡張の単純なサンプルである Hello World と同様に、.NET マネージ コード アセンブリを作成するようにコンパイラに指示するには /clr スイッチが必要です。
便宜上、このチュートリアルのサンプル コンポーネントは、ソース コードからの相対位置を示す ..\Bin サブディレクトリで維持されています。コンポーネントをコンパイルしてその位置に配置するには、/out パラメータを使用して、完全限定ファイル名を指定します。コンパイルしたコンポーネントを他のプログラムで使用する予定がある場合は、アセンブリキャッシュに入れておくこともできます。また、.dll ファイル名拡張子を付けて出力ファイルを指定した場合でも、.dll ファイル名拡張子付きの実行可能ファイルではない DLL を作成するためには、追加の -dll スイッチが必要となります。
参照
Visual C# でのコンポーネント | Visual Basic でのコンポーネント | 単純なコンポーネントのクライアント | 開発チュートリアルのまとめ | 付録 A: 名前空間を検索するためのツール