【发布时间】:2013-10-31 22:48:42
【问题描述】:
我需要在 C 库中设置一个与 C# 函数相等的回调函数,并且在没有 dlopen 或 kernel32(这似乎是 windows/unix 特定的)的情况下无法找到一种方法。有谁知道这样做的方法吗?
问题:C 共享库暴露了函数指针,其值应该通过覆盖它们来设置。例如。
//C Code
extern void (*ptr_R_ShowMessage) (const char *)
当前的 c# 代码创建一个与此签名匹配的函数的委托,使用 marshal 类获取指向该委托的指针,然后用此值覆盖 C 指针。
//call to libdl or kernel32.dll
IntPtr showPointer = GetFunctionAddress(hndl,"ptr_R_ShowMessage");
IntPtr newShowPointer = Marshal.GetFunctionPointerForDelegate(matchingDelegate);
Marshal.WriteIntPtr(showPointer, newShowPointer);
对 libdl 和 kernel32.dll 的要求会导致各种问题......理想情况下可以避免。
有谁知道如何使 C 库指针指向 C# 代码,而无需修改 C 代码或使用 GetFunctionAddress 动态加载?我认为这可能是不可能的,但似乎有可能。
【问题讨论】:
标签: c# c interop function-pointers