2010-04-17 2 views
0

Например. Я следующий метод делегата я хочу использовать в качестве функции обратного вызова с неуправляемым кодом:Получение объекта в неуправляемой функции обратного вызова

public delegate void Callback(IntPtr myObject); 

Callback callback; 

Я зарегистрировать его следующим образом:

[DllImport("a.dll")] 
public static void registerCallback(IntPtr callbackFunction, IntPtr anObject); 

// ... 

this.myObject = new MyClass(); 
this.objectPin = GCHandle.Alloc(this.myObject, GCHandleType.Pinned); 
registerCallback(Marshal.GetFunctionPointerForDelegate(callback), objectPin.AddrOfPinnedObject()); 

Теперь, когда функция обратного вызова вызывается она будет иметь Указатель/Ручка объекта класса MyClass. Я мог бы использовать Marshal.PtrToStructure, чтобы преобразовать это в объект MyClass. Однако то, что я хотел бы иметь, заключается в том, что определение делегата уже содержит класс MyClass. например:

public delegate void Callback(MyClass myObject); 

Я пробовал, но это не сработает. Я также попытался следующие, которые не работали:

public delegate void Callback([MarshalAs(UnmanagedType.IUnknown)]MyClass myObject); 

Я полагаю, что нужно что-то вроде «UnmarshalAs» на данный момент, но, к сожалению, это не доступно. Любые предложения о том, как я могу потеряться в этом IntPtr в моей функции обратного вызова и получить его в виде обычного управляемого объекта MyClass?

ответ

2

GCHandle.FromIntPtr Method:

void MyCallback(IntPtr anObject) 
{ 
    GCHandle gch = GCHandle.FromIntPtr(anObject); 
    MyClass myObject = (MyClass)gch.Target; 
} 
+0

Я как раз собирался вернуться, чтобы сказать, я нашел способ литья GCHandöe к IntPtr, и наоборот, когда я увидел обновленный ответ. Спасибо многому человеку :) –

Смежные вопросы