C# 有没有一种方法可以在C中获取extern方法的函数指针#
我想获取C# 有没有一种方法可以在C中获取extern方法的函数指针#,c#,pinvoke,function-pointers,dllimport,C#,Pinvoke,Function Pointers,Dllimport,我想获取extern方法的函数指针(即IntPtr),例如: [DllImport("DbgHelp.dll")] static extern void SymFunctionTableAccess64(IntPtr process, ulong addrBase); [DllImport("DbgHelp.dll")] static extern int StackWalk64(......., IntPtr FunctionTableAccessRoutine, ....); 然后,它也
extern
方法的函数指针(即IntPtr
),例如:
[DllImport("DbgHelp.dll")]
static extern void SymFunctionTableAccess64(IntPtr process, ulong addrBase);
[DllImport("DbgHelp.dll")]
static extern int StackWalk64(......., IntPtr FunctionTableAccessRoutine, ....);
然后,它也可用作extern
方法的参数,例如:
[DllImport("DbgHelp.dll")]
static extern void SymFunctionTableAccess64(IntPtr process, ulong addrBase);
[DllImport("DbgHelp.dll")]
static extern int StackWalk64(......., IntPtr FunctionTableAccessRoutine, ....);
我知道我可以使用
LoadLibrary
然后使用GetProcAddress
,或者用C方法包装函数,然后使用Marshal.GetFunctionPointerForDelegate
作为函数指针。我想知道我们是否可以直接从P/Invoke机制中检索函数指针,因为在运行时,函数已经通过DllImport
加载。请注意,我的问题并不特定于StackWalk64
或任何DbgHelp.dll函数。您需要使用GetProcAddress
获取外部非托管函数的地址
这样做没有问题。函数并不是这样加载的。模块已加载。加载模块后,GetProcAddress
仅在模块的导出表中执行查找。如果知道模块已加载,则无需再次调用LoadLibrary
。您可以使用GetModuleHandle
。调用LoadLibrary
也不是真的会出现任何问题。如果模块已经加载,那么对LoadLibrary
的调用只会增加模块的引用计数,并返回其句柄
请注意,您正在尝试的内容看起来不适合p/invoke。本机代码当然更合适 看看这篇文章。[包含函数指针的编组结构][1][1]:可能有帮助。“在运行时,函数将通过
DllImport
..”加载。事实上,在首次从托管代码调用函数之前,不会发生这种情况,托管代码会动态加载DLL。所以,如果你不是真的调用它,LoadLibrary
是绝对必要的。我不知道你在用StackWalk64
和其他类似的API干什么。但是,如果您想为本机应用程序编写某种托管调试器(包括仅获取运行进程的堆栈跟踪),最好将所有逻辑封装在本机DLL中,为托管代码提供“易用”的DllImport入口点(在那里,完成了:-|)。返回类型为IntPtr,不是空的。不要为此使用pinvoke,尤其是不要使用GetProcAddress(),因为DbgHelp api中有很多。