Например. Я следующий метод делегата я хочу использовать в качестве функции обратного вызова с неуправляемым кодом:Получение объекта в неуправляемой функции обратного вызова
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?
Я как раз собирался вернуться, чтобы сказать, я нашел способ литья GCHandöe к IntPtr, и наоборот, когда я увидел обновленный ответ. Спасибо многому человеку :) –