네이티브 dll에 C# 콜백 함수를 전달하려고합니다. 그것은 잘 작동하지만 콜백 메서드의 부모 개체에 액세스 할 수있는 방법을 찾을 수 없습니다.네이티브 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이 델파이 및 테스트 기능의 서명에 기록 된
는 다음 나는 포인터를 얻기 위해 시도 할 때
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