Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有一种方法可以在C中获取extern方法的函数指针#_C#_Pinvoke_Function Pointers_Dllimport - Fatal编程技术网

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中有很多。