有谁知道我如何解决这个错误?
错误:
调用 PInvoke 函数使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我正在使用 P/Invoke 从托管代码中调用本机代码。本机代码正在通过动态链接库导入。
步骤是
- 定位包含这些函数的 .dll。
- 将 .dll 加载到内存中
- 在内存中定位函数的地址
- 将此对象的内存表示转换为数据格式(编组)
DLL 有一个带有声明的函数
long __stdcall Connect (long,long,long,long,long,long,long,long);`
在我的应用程序中,我创建了一个委托
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate long delConnect(long a, long b, long c, long d, long e, long f, long g, long h);`
然后我创建了一个用于加载 dll 并在内存中定位函数地址的类
`static class NativeMethods { [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
}`
现在,当我尝试使用该功能时,我收到了错误
IntPtr pDll = NativeMethods.LoadLibrary("serial.dll");
IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "_Connect@32");
delConnect connect = (delConnect)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,typeof(delConnect));
long check = connect(1, 0, 12, 9600, 0, 0, 8, 0);
bool result = NativeMethods.FreeLibrary(pDll);`
由于名称修改,我在 GetProcAddress 方法的函数名称参数中使用了“_Connect@32”而不是“Connect”。
当我调试时,我在包含语句的行中收到此错误
长校验 = connect(1, 0, 12, 9600, 0, 0, 8, 0);