Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# DllIImport函数引发堆栈异常_C#_Dllimport - Fatal编程技术网

C# DllIImport函数引发堆栈异常

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;

我正在尝试调用此h文件中的函数GetFirstAvailableTSComport

从h文件中获取的相关结构和枚举(并转换为C#代码)

德林波特

[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;
}