C#GetProcAddress返回零出于某种原因,每当我的C#.NET2.0应用程序调用GetProcAddress时,它总是返回零。公共类MyClass{内部静态类UnsafeNativeMethods{[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternIntPtrLoadLibrary(stringlpFileName);[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternboolSetDllDirectory(stringlpPathName);[DllImport("kernel32.dll",CharSet=CharSet.Auto,SetLastError=true)]internalstaticexternIntPtrGetProcAddress(IntPtrhModule,stringprocName);}privatevoidMyFunc(){IntPtr_dllHandle;内部指针_fptr;string_fullPath=".\mydll.dll";string_procName="MyDllFunc";_dllHandle=UnsafeNativeMethods.LoadLibrary(_fullPath);_procName);//<--总是返回零。我确定函数名称拼写正确,并且_fullPath可能是正确的,因为_dllHandle始终被赋予非零值。感谢您提供的任何见解。谢谢。GetProcAddress仅适用于ANSI,因此我们通过告诉它在编组字符串参数时始终使用ANSI来帮助运行时。我们还阻止运行时查找不存在的GetProcAddressA,因为C#的默认设置是将ExactSpelling设置为false。http://www.pinvoke.net/default.aspx/kernel32.getprocaddress你真的需要添加一些错误检查。至少有validation_dllHandle!=IntPtr。零。此外,根据当前工作目录使用Assembly.GetEntryAssembly()是危险的。获取完整路径名的位置。函数名称可能有误。导出通常会被修饰,例如_MyDllFunc或_MyDllFunc@4。如果它是由C++编译器编译的,那就更疯狂了。在DLL上使用Dumpbin.exe/exports查看真实名称。要返回错误处理,请在[DllImport]属性中使用SetLastWin32Error。如果函数返回false或IntPtr.Zero,则会引发Win32Exception。编辑:我看到了真正的问题。将CharSet.Auto用于GetProcAddress()是错误的。不幸的是,它是唯一一个只有ANSI版本的WindowsAPI函数。你必须使用CharSet.Ansi。获得正确[DllImport]声明的好地方是pinvoke.net您没有展示如何从DLL导出函数,但我怀疑问题是导出的名称不是您的意思。您可以运行dumpbin/exportsmydll.dll查看dll的导出以验证名称。如果您显示导出的代码片段,我可以提供更直接的建议。您可以尝试使用extern"C"修饰导出函数以消除名称重整作为测试。您在DLL的.DEF文件中的导出是否与此处的输入匹配?您可以使用dumpbin查找导出的内容,其他回复在这里。每个GetLastError()的GetProcAddress()的底层Win32错误是什么?您可以在本机代码中尝试此操作,以便首先计算正确的输入而无需额外的P/Invoke包袱。以上就是C#学习教程:C#GetProcAddress返回零分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
