日期:2014-05-17  浏览次数:20945 次

C# 通过dllimport 调用C++ dll
C++
typedef int RS;
typedef struct {
// SDK版本号, a.b.c.d形式
u_int8_t version[4];
// 描述
char desc[64];
} cl_lib_info_t;

CLIB_API RS cl_init(u_int32_t client_type, cl_lib_info_t *info);

C#对应

public struct cl_lib_info_t
    {
        // SDK版本号, a.b.c.d形式
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public byte[] version;
        // 描述
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string desc;
    }

[DllImport("clib.dll")]
public static extern int cl_init(uint client_type, out cl_lib_info_t info);

报这个
检测到 PInvokeStackImbalance Message: 对 PInvoke 函数“WindowsFormsApplication2!WindowsFormsApplication2.yinhesdk::cl_init”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

没使用过dllimport,请问我的类型应该怎么对应?

------解决方案--------------------
有一个工具叫CLRInsideOut,用它可以将C++转换成对应的C#类型。
------解决方案--------------------
u_int8_t version[4]; 改成 char 
 public byte[] version; 改成string
试试。有可能是定义的类型不对引起的。