C#中的C / C ++结构通过P / Invoke

时间:2012-12-02 10:30:10

标签: c# .net visual-c++ pinvoke

我正在使用P / Invoke执行我的第一步,并尝试表示这些C / C ++结构:

#ifndef struct_emxArray_char_T_1024
#define struct_emxArray_char_T_1024
struct emxArray_char_T_1024
{
    char_T data[1024];
    int32_T size[1];
};

#ifndef typedef_e_struct_T
#define typedef_e_struct_T
typedef struct
{
    emxArray_char_T_1024 value1;
    real_T value2;
    uint32_T value3;
    boolean_T value4;
} e_struct_T;

在C#中使用它:

[StructLayout(LayoutKind.Sequential)]
class emxArray_char_T_1024
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
    public string data;
    [In, MarshalAs(UnmanagedType.I4)]
    public int size;
}

StructLayout(LayoutKind.Sequential)]
class e_struct_T
{
    emxArray_char_T_1024 value1;
    double value2;
    uint value3;
    bool value4;
}

这看起来足够吗?我对教程中的这样的评论不太确定:

compile with: /target:module

PS:

以上'类型'似乎是这样定义的:

typedef double real_T;
typedef unsigned int uint32_T;
typedef unsigned char boolean_T;
typedef char char_T;
typedef int int32_T;

1 个答案:

答案 0 :(得分:1)

最终结构对我来说没问题,你应该做的唯一改变就是你的boolean_T是如何被编组的。默认C样式bool是一个字节有符号整数,因此必须将其封送为I1。您将boolean_T声明为unsigned char,因此它应为U1

[StructLayout(LayoutKind.Sequential)]
class e_struct_T
{
    emxArray_char_T_1024 value1;
    double value2;
    uint value3;

    [MarshalAs(UnmanagedType.U1)] 
    bool value4;
}