C ++/CLIのアンマネージAPIを使用する必要があります。このAPIは、任意のユーザーデータへのvoidポインターといくつかのコールバックを格納します。次に、最終的にそれらのコールバックを呼び出し、ユーザーデータをvoid*として渡します。
これまでのところ、ネイティブクラスがその「this」ポインタをユーザーデータとして渡し、そのポインタを使用してAPIをこのクラスに呼び戻す必要がありました。
static void __stdcall Callback(void* userData) {
((MyType*)userData)->Method();
}
class MyType {
public:
MyType() { RegisterWithApi((void*)this, Callback); }
void Method();
};
マネージドクラスを使用してこれを翻訳しようとしています。gcroot型を使用して、管理された参照をネイティブコードに安全に格納できることがわかったので、現在の方法は次のとおりです。
// This is called by the native API
static void __stdcall Callback(void* userData) {
// Cast back to gcroot and call into managed code
(*(gcroot<MyType^>*)userData)->Method();
}
ref class MyType {
gcroot<MyType^>* m_self;
public:
MyType() {
m_self = new gcroot<MyType^>;
RegisterWithApi((void*)m_self, Callback);
}
~MyType() { delete m_self; }
// Method we want called by the native API
void Method();
}
これはC++/ CLIコンパイラには問題ないように見えますが、私は完全に安心しているわけではありません。私が理解していることから、gcrootは、GCによって移動されるときに、管理された参照を何らかの形で追跡します。アンマネージコードによってvoid*として保存されている間、これを実行できますか?このコードは安全ですか?
ありがとう。