请教各位老师:关于C#调用C++中返回结构体的DLL的一些问题。

时间:2021-06-21 10:29:45
下图为C++中定义的结构体:
//Define Method
 typedef struct {
 int ints;
 int intarray[5];
 char chars;
 char chararray[5];
 double floats;
 double floatarray[5];
 int* intPoint;
 int* intPointarray[5];
 }Strusts;
下图为C#中定义的结构体:
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 0)]
        public struct Strusts
        {
            public int ints;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public int[] intarray;
            public char chars;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string chararray;
            public System.Double floats;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public System.Double[] floatarray;
            public IntPtr intPoint;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
            public IntPtr[] intPointarray;
        };
1、整形指针及整形指针数组,在C#里面能返回地址,但是每个指针指向的地址相差都是12,这样是不是有问题?
2、我想取地址里的数据,但是怎么都取不出来,我试过了Marshal.Copy()、IntPtr加地址偏移的方法、反正我知道的方法都试过了,取出来的数据都是不对的,整个过程没有报错。
3、希望各位老师能帮忙指点一下,非常感谢!我是初学者,基础知识不是很好,自己也买了一些书籍在看。

2 个解决方案

#1


  [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 0)]
0是采用系统默认值,不推荐使用
修改为 Pack = 1试试

具体对应可以参考这篇文章
http://blog.csdn.net/Donjuan/article/details/3865026


#2


谢谢!
之前Pack=0-4之间我都试过,取出来的数据都是不对的。

#1


  [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 0)]
0是采用系统默认值,不推荐使用
修改为 Pack = 1试试

具体对应可以参考这篇文章
http://blog.csdn.net/Donjuan/article/details/3865026


#2


谢谢!
之前Pack=0-4之间我都试过,取出来的数据都是不对的。