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 *로 저장되는 동안이 작업을 관리합니까? 이 코드는 안전한가요?
감사합니다.
마샬링 :: GetFunctionPointerForDelegate(), 예를 들어 [여기 있습니다] (http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code/2973278#2973278)) –