Ich brauche eine nicht verwaltete API von C++/CLI. Diese API speichert einen Void-Zeiger auf beliebige Benutzerdaten und einige Callbacks. Es ruft dann schließlich diese Rückrufe auf und übergibt die Benutzerdaten als void *.Ist diese Verwendung von gcroot sicher?
Bisher hatte ich eine native Klasse sein „dieses“ Zeiger als die Benutzerdaten übergeben, und die Verwendung dieser Zeiger den API-Aufruf zu haben, wieder in dieser Klasse, das heißt:
static void __stdcall Callback(void* userData) {
((MyType*)userData)->Method();
}
class MyType {
public:
MyType() { RegisterWithApi((void*)this, Callback); }
void Method();
};
Ich versuche, übersetze dies mit einer verwalteten Klasse. Ich fand, dass der Typ gcroot sicher verwendet werden kann, um eine verwaltete Referenz zu speichern in nativen Code, also hier ist, wie ich es jetzt tue:
// 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();
}
Während dies dem C Fein scheint ++/CLI-Compiler, bin ich nicht vollkommen versichert. Von dem, was ich verstehe, behält Gcroot irgendwie seine gemanagte Referenz bei, da sie vom GC bewegt wird. Wird es dies schaffen, während es als void * durch nicht verwalteten Code gespeichert wird? Ist dieser Code sicher?
Danke.
Do favor Marshal :: GetFunctionPointerForDelegate(), ein Beispiel [ist hier] (http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code/2973278#2973278) –