C# DllIImport函数引发堆栈异常
我正在尝试调用此h文件中的函数GetFirstAvailableTSComport 从h文件中获取的相关结构和枚举(并转换为C#代码) 德林波特C# DllIImport函数引发堆栈异常,c#,dllimport,C#,Dllimport,我正在尝试调用此h文件中的函数GetFirstAvailableTSComport 从h文件中获取的相关结构和枚举(并转换为C#代码) 德林波特 [DllImport("ThreeSpace_API.dll")] private static extern int getFirstAvailableTSSComPort([Out, MarshalAs(UnmanagedType.Struct)] out Comport port, int filter); 召唤 Comport port;
[DllImport("ThreeSpace_API.dll")]
private static extern int getFirstAvailableTSSComPort([Out, MarshalAs(UnmanagedType.Struct)] out Comport port, int filter);
召唤
Comport port;
var error = getFirstAvailableTSSComPort(out port, 0);
我明白了
对PInvoke函数的调用
“是的!YEi3.Program::GetFirstAvailableTSComport'已使
堆栈这可能是因为托管PInvoke签名没有
匹配非托管目标签名。检查通话是否正常
PInvoke签名的约定和参数与目标匹配
非托管签名
C代码使用
cdecl
调用约定,但您的C代码使用stdcall
。这就是您收到p/invoke堆栈不平衡消息的原因
更改DllImport
以指定调用约定:
[DllImport("ThreeSpace_API.dll", CallingConvention=CallingConvention.Cdecl)]
private static extern int getFirstAvailableTSSComPort(
out Comport port,
int filter
);
请注意,参数的默认编组已足够
此更改将解决堆栈不平衡问题,但您的代码仍将无法工作。这是因为结构翻译错误。内联字符串需要作为ByValTStr
进行封送:
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct ComPort {
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=64)]
public string com_port;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=256)]
public string friendly_name;
public TSS_Type sensor_type;
}
C代码使用
cdecl
调用约定,但您的C代码使用stdcall
。这就是您收到p/invoke堆栈不平衡消息的原因
更改DllImport
以指定调用约定:
[DllImport("ThreeSpace_API.dll", CallingConvention=CallingConvention.Cdecl)]
private static extern int getFirstAvailableTSSComPort(
out Comport port,
int filter
);
请注意,参数的默认编组已足够
此更改将解决堆栈不平衡问题,但您的代码仍将无法工作。这是因为结构翻译错误。内联字符串需要作为ByValTStr
进行封送:
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct ComPort {
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=64)]
public string com_port;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=256)]
public string friendly_name;
public TSS_Type sensor_type;
}