繁体   English   中英

传递包含C和C#之间结构数组的结构(DLL和P调用)

[英]Passing structure containing an array of structures between C and C# (DLL and P invoke)

我有一个复杂的结构C dll我真的是C#的新手:

typedef struct {
    int a;
    int b;
} simple_struct;

typedef struct {
    int d;
    int e;
    simple_struct f[20];
    short g;
    simple_struct h[20];
    short i;
} complex_struct;

问题是我无法使用这种结构连接我的C#应用​​程序!

在DLL中有一个函数Ge​​tData(complex_struct * myStruct),我应该从C#中调用它,所以我创建了:

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    unsafe struct simple_struct {
        public int a;
        public int b;
    } ;

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    unsafe struct complex_struct {
        public int d;
        public int e;
        public simple_struct[] f;
        public short g;
        public simple_struct[] h;
        public short i;
    } ;

但问题是,当我将complex_struct作为GetData的参数传递时,所有字段都从我身上填充,但不是我的两个simple_struct数组(我的意思是f和h)! 他们的价值观无效!

谢谢,有人可以帮助我


嗨,谢谢你的回复,

我已经像你说的那样做了,但是当我调用GetData时仍然有另一个问题,进程崩溃而没有任何消息(一种异常):

这是我的急剧代码:namespace dll_test_import_c_sharp {class Program {[StructLayout(LayoutKind.Sequential,Pack = 1)] struct simple_struct {public int a; public int b; };

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct complex_struct {
            public int d;
            public int e;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public simple_struct[] f;
            public short g;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public simple_struct[] h;
            public short i;
        } ;




        [DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
        static extern int GetData(ref complex_struct a);



        static void Main(string[] args)
        {
            complex_struct a = new complex_struct();
            GetData(ref a);
            return;
        }

    }
}

我已经做了很多printf我GetData并且所有这些都执行得很好,好像'return'指令崩溃了!

我试图通过ref或out调用GetData,它们都不起作用......


嗨,谢谢你的回复,

我已经像你说的那样做了,但是当我调用GetData时仍然有另一个问题,进程崩溃而没有任何消息(一种异常):

这是我的急剧代码:namespace dll_test_import_c_sharp {class Program {[StructLayout(LayoutKind.Sequential,Pack = 1)] struct simple_struct {public int a; public int b; };

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        struct complex_struct {
            public int d;
            public int e;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public simple_struct[] f;
            public short g;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
            public simple_struct[] h;
            public short i;
        } ;




        [DllImport("test_dll.dll", CharSet = CharSet.Unicode)]
        static extern int GetData(ref complex_struct a);



        static void Main(string[] args)
        {
            complex_struct a = new complex_struct();
            GetData(ref a);
            return;
        }

    }
}

我已经做了很多printf我GetData并且所有这些都执行得很好,好像'return'指令崩溃了!

我试图通过ref或out调用GetData,它们都不起作用......

您需要更改struct上的数组定义以指定它是按值/内联数组

[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe struct complex_struct {
    public int d;
    public int e;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public simple_struct[] f;
    public short g;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public simple_struct[] h;
    public short i;
} ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM