LoadLibrary
및 GetProcAddress
을 사용하여 내 보낸 libpd_printhook
변수에 대한 포인터를 얻을 수 있습니다. 그런 다음 Marshal.WriteIntPtr
및 Marshal.GetFunctionPointerForDelegate
을 사용하여 대리인을 할당 할 수 있습니다.
[DllImport("kernel32", SetLastError=true, CharSet=CharSet.Unicode)]
static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true,
SetLastError=true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);
.....
IntPtr lib = LoadLibrary(@"mydll.dll");
IntPtr plibpd_printhook = GetProcAddress(lib, "libpd_printhook");
Marshal.WriteIntPtr(plibpd_printhook,
Marshal.GetFunctionPointerForDelegate(mydelegate));
FreeLibrary(lib);
간략한 예를 위해 excised 한 오류 검사를 추가 할 수 있습니다. 당신이 관리되지 않는 라이브러리의 컨트롤에있는 경우
지금, 나는 여전히이 함수 포인터에 쓰기 캡슐화하는 기능을 추가하는 것이 좋습니다 것입니다. 그게 나에게 더 좋은 인터페이스 같아.
아, 하나의 몰랐지만 내가 어떻게 그런 다음에 대리자를 할당 할 것인가? – thalm
네, 제 질문에 대한 정답으로 지금 당신의 대답을 받아 들였습니다. 하지만 내가 사용하는 dll이 오픈 소스이기 때문에 아마 usr이 제안한 것처럼 setter 메소드를 추가 할 것입니다. http://stackoverflow.com/questions/2167895/howto-implement-callback-interface-from-unmanaged-dll-to-net-app – thalm
흥미로운 질문을 내가 세터가 있음을 동의 : 나는이 도움이 될 것으로 네이티브 코드를 컴파일하는 경우 올바른 솔루션입니다. –