C++/CLIのアンマネージAPIを使用する必要があります。このAPIは、任意のユーザーデータといくつかのコールバックに対するvoidポインタを格納します。その後、最終的にそれらのコールバックを呼び出し、ユーザーデータをvoid *として渡します。私がしようとしているgcrootのこの使用法は安全ですか?
static void __stdcall Callback(void* userData) {
((MyType*)userData)->Method();
}
class MyType {
public:
MyType() { RegisterWithApi((void*)this, Callback); }
void Method();
};
を:
これまでのところ私はすなわち、ユーザデータとしての「この」ポインタを渡して、このクラスに戻ってAPI呼び出しを持つようにそのポインタを使用してネイティブクラスを持っていました管理クラスを使用してこれを翻訳します。私は、型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 *として格納されている間にこれを行うことができますか?このコードは安全ですか?
ありがとうございました。
Marshal :: GetFunctionPointerForDelegate()の例、[ここにあります](http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code/2973278#2973278) ) –