C/C++;C#中的结构通过P/Invoke
我正在使用p/Invoke执行我的第一步,并尝试表示这些C/C++结构: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
#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-stylebool
是一个字节有符号整数,因此必须将其封送为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;
}