C# 如何获取指向C函数的指针?

C# 如何获取指向C函数的指针?,c#,.net,delegates,pinvoke,function-pointers,C#,.net,Delegates,Pinvoke,Function Pointers,某些C函数(A)将函数指针作为参数。它检查指针是否指向某个C函数(B)。所以,我需要把指向B的指针传递给A。 我认为我可以通过以下方式实现这一点: [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void MyDelegate(); [DllImport("somelibrary", CallingConvention = CallingConvention.Cdecl)] private static e

某些C函数(A)将函数指针作为参数。它检查指针是否指向某个C函数(B)。所以,我需要把指向B的指针传递给A。 我认为我可以通过以下方式实现这一点:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MyDelegate();

[DllImport("somelibrary", CallingConvention = CallingConvention.Cdecl)]
private static extern void B();
然后获取函数的地址:

var pointer = Marshal.GetFunctionPointerForDelegate(new MyDelegate(B));
但是很明显,我得到的指针并不指向B(因为,通过调用
GetFunctionPointerForDelegate
,用两个不同的委托围绕B,我得到了不同的结果)。 那么,有没有一种方法可以获取一个直接指向B的指针呢?

我想您要做的是获取一个非托管函数的地址。
GetFunctionPointerForDelegate
所做的是返回一个指向要调用的非托管代码的托管地址的指针,而这不是您要寻找的

如果需要从模块中获取本机函数的地址,则应使用本机Win32,如在库中使用
GetProcAddress
。因此,您要做的是使用(或其变体之一)获取模块的句柄,将其与您要查找的导出的名称一起传递到,在示例中为“B”,然后使用减少对模块的引用计数。GetProcAddress的返回值为您提供了要查找的指针。

我认为您试图做的是获取非托管函数的地址。
GetFunctionPointerForDelegate
所做的是返回一个指向要调用的非托管代码的托管地址的指针,而这不是您要寻找的


如果需要从模块中获取本机函数的地址,则应使用本机Win32,如在库中使用
GetProcAddress
。因此,您要做的是使用(或其变体之一)获取模块的句柄,将其与您要查找的导出的名称一起传递到,在示例中为“B”,然后使用减少对模块的引用计数。GetProcAddress的返回值为您提供了要查找的指针。

感谢您的快速回复。我对它投了赞成票,一旦我确定它有效,我会接受它作为答案。谢谢你的快速回复。我对它投了更高的票,一旦我确定它有效,我会接受它作为答案。