Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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/C++;C#中的结构通过P/Invoke_C#_.net_Visual C++_Pinvoke - Fatal编程技术网

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

C/C++;C#中的结构通过P/Invoke,c#,.net,visual-c++,pinvoke,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 s

我正在使用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#中使用此选项:

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

compile with: /target:module
附言:

上述“类型”的定义如下:

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

最终的结构在我看来还可以,您应该做的唯一更改是如何封送
boolean\T
。默认的C-style
bool
是一个字节有符号整数,因此必须将其封送为
I1
。您将
boolean\u 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;
}

首先:真实的定义是什么?浮动还是双倍?布尔值?字节还是整数?查特?谢谢你,阿德里亚诺。没有意识到这些“类型”并不常见。查看了头文件并在PS中找到了内容(请参见编辑的问题)。好的,System.Boolean是4个字节,因此已使用Marshallas对其进行了解密。我觉得其他的都没问题。谢谢。请您用正确的布尔属性发布一个答案好吗?您可以使用[Marshallas(UnmanagedType.I1)]我正在仔细研究这个问题。值2似乎总是零。假设我可以用double来做真的,这可能太天真了吧?谢谢。不用了,应该没问题。尝试用int替换value2,以检查得到的结果。这可能是另一个struct.Mmmh的不一致,只看emxArray_char_T_1024。int32_T size[1]->[In,marshallas(UnmanagedType.I4)]公共int size是否正确?我想可能是这样,您能尝试使用[marshallas(UnmanagedType.ByValArray,SizeConst=1)]公共int[]size吗?
[StructLayout(LayoutKind.Sequential)]
class e_struct_T
{
    emxArray_char_T_1024 value1;
    double value2;
    uint value3;

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