我試圖將C#回調函數傳遞給本機DLL。它工作正常,但我找不到方法來訪問回調方法的父對象。這裏有一個代碼,演示了什麼,我想做的事:在傳遞給本機DLL的C#回調中訪問管理對象
class MyForm: Form {
public delegate void CallbackDelegate(IntPtr thisPtr);
[DllImport("mylib.dll", CallingConvention = CallingConvention.StdCall)]
public static extern void Test(CallbackDelegate callback);
int Field;
static void Callback(IntPtr thisPtr)
{
// I need to reference class field Field here.
MyForm thisObject = ?MagicMethod?(thisPtr);
thisObject.Field = 10;
}
void CallExternalMethod()
{
Test(Callback);
}
}
我試圖得到的this
的指針,但我得到了以下異常:「對象包含非基本或非blittable數據」。我應該提到父對象是一個WindowsForms表單。
UPDATE
DLL是用Delphi編寫和測試功能的簽名如下:
type
TCallback = procedure of object; stdcall;
procedure Test(Callback: TCallback); stdcall;
我收到上述錯誤消息時,我試圖讓指針請使用以下代碼:
var ptr = GCHandle.Alloc(this, GCHandleType.Pinned).AddrOfPinnedObject();
如何被聲明在中是指mylib.dll您的本地試驗方法?我沒有要求定義,只是方法的簽名。 – Mzn
你能提供更多的代碼嗎? –
@David Heffernan我實際上是在編寫代碼,而不是複製原文以避免不相關的細節。我想我寫了所有相關的代碼。什麼不見了? – Max