由于某些原因,每当我的C#.NET 2.0应用程序调用GetProcAddress,它总是返回零.
public class MyClass { internal static class UnsafeNativeMethods { [DllImport("kernel32.dll",CharSet = CharSet.Auto,SetLastError = true)] internal static extern IntPtr LoadLibrary(string lpFileName); [DllImport("kernel32.dll",SetLastError = true)] internal static extern bool SetDllDirectory(string lpPathName); [DllImport("kernel32.dll",SetLastError = true)] internal static extern IntPtr GetProcAddress(IntPtr hModule,string procName); } private void MyFunc() { IntPtr _dllHandle; IntPtr _fptr; string _fullPath = ".\\mydll.dll"; string _procName = "MyDllFunc"; _dllHandle = UnsafeNativeMethods.LoadLibrary(_fullPath); _fptr = UnsafeNativeMethods.GetProcAddress(_dllHandle,_procName); // <-- Always returns zero. } }
我确定功能名称拼写正确,_fullPath可能是正确的,因为_dllHandle总是被赋值为非零值.您可能能够提供的任何见解表示赞赏.谢谢.
解决方法
GetProcAddress只有一种ANSI风格,因此我们通过在编组string参数时告诉它始终使用ANSI来帮助运行时.我们还阻止运行时查找不存在的GetProcAddressA,因为C#的默认值是将ExactSpelling设置为false.