Получение объекта в неуправляемой функции обратного вызова

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

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?


person Daniel Baulig    schedule 17.04.2010    source источник


Ответы (1)


GCHandle.FromIntPtr Метод:

void MyCallback(IntPtr anObject)
{
    GCHandle gch = GCHandle.FromIntPtr(anObject);
    MyClass myObject = (MyClass)gch.Target;
}
person dtb    schedule 17.04.2010
comment
Я как раз собирался вернуться, чтобы сказать, что нашел способ приведения GCHandöe к IntPtr и наоборот, когда увидел ваш обновленный ответ. Спасибо большое чувак :) - person Daniel Baulig; 18.04.2010