C++/CLI ラッピング入門
今回は関数ラッピングについてです。
—————————————————————–
関数のラップは、
マネージドクラスのメンバ関数の中で、
ネイティブ関数を適切な引数を与えて呼び出し、
戻り値を適切にラップして返すという作業になります。
全てのマネージ関数はメンバ関数または、staticメンバ関数である必要があります。
・引数も戻り値もない関数は普通に呼び出すだけでラップできます。
“ref class”は参照型のマネージドクラス(C#でいうクラス)で有ることを表しています。
“value class”にすると値型マネージクラス(C#で言う構造体)になりますが、
コンストラクタやデストラクタの使用などに制限があるため、アンマネージクラスのラップにはあまり使いません。
//---------------------
// ネイティブ関数宣言
void func()
{
...
}
//マネージクラスの宣言
public ref class CLI
{
public:
static void Func()
{
//ネイティブ関数の呼び出し
::func();
}
};
・引数がintなどの基本型の場合はそのまま渡してOK
//---------------------
// ネイティブ関数宣言
void func(int i)
{...}
//---------------------
//マネージクラスの宣言
public ref class CLI
{
public:
static void Func(int i)
{
//ネイティブ関数の呼び出し
::func( i );
}
};
//---------------------
// マネージ関数呼び出し
CLI.Func(1);
//---------------------
・引数がオブジェクトの場合、
まず、その引数の型のラッパークラスを作成し、
internalなポインタ、またはそれにアスタリスクをつけて取得した値を引数に渡す。
//---------------------
ネイティブクラス宣言
class nativeClass
{
....
};
//---------------------
// ネイティブ関数宣言
void func(nativeClass nativeobject)
{...}
//---------------------
//マネージクラスの宣言
public ref class CLIClass
{
CLIClass() {pData = new nativeClass();};
~CLIClass(){ this->!CLIClass(); }
!CLIClass()
{
delete pData;
pData = NULL;
}
internal:
::nativeClass* pData;
};
public ref class CLI
{
public:
static void Func(CLIClass^ cliobj)
{
//ネイティブ関数の呼び出し
::func(*cliobj->pData);
}
};
//---------------------
// C# マネージ関数呼び出し
CLIClass obj = new CLIClass();
CLI.Func(obj);
//---------------------
・戻り値がオブジェクトの場合、
まず、ラッパークラスを作り、それを生成する。
関数の戻り値をポインタの指す位置にコピーする。
//---------------------
ネイティブクラス宣言
class nativeClass
{
....
};
//---------------------
// ネイティブ関数宣言
nativeClass func()
{...}
//---------------------
//マネージクラスの宣言
public ref class CLIClass
{
CLIClass() {pData = new nativeClass();};
~CLIClass(){ this->!CLIClass(); }
!CLIClass()
{
delete pData;
pData = NULL;
}
internal:
::nativeClass* pData;
};
public ref class CLI
{
public:
static CLIClass^ Func(CLIClass^ cliobj)
{
CLIClass^ obj = new CLIClass();
*(obj->pData) = ::func();
return obj;
}
};
//---------------------
// C# マネージ関数呼び出し
CLIClass obj = new CLIClass();
obj = CLI.Func();
//---------------------
戻り値がポインタの場合はさまざまなパターンがあるので次回