Например. У меня есть следующий метод делегата, который я хочу использовать в качестве функции обратного вызова с неуправляемым кодом:
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?