Передача структуры, содержащей массив структур между C и C # (DLL и P вызывают) - PullRequest
3 голосов
/ 23 февраля 2012

У меня есть 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 есть функция GetData (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, процесс завершается сбоем без какого-либо сообщения (своего рода исключение):

Это мой код C sharp: 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 i GetData, и все они хорошо выполнены, похоже, что инструкция 'return' не работает !!

Я пытался вызвать GetData по ref или out, и оба они не работают ...


Привет и спасибо за ваш ответ,

Iсделали так, как вы сказали, но у меня все еще есть другая проблема, когда я вызываю GetData, процесс завершается сбоем без какого-либо сообщения (своего рода исключение):

Это мой C-код: пространство имен 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 i GetData, и все они хорошо выполнены, похоже, что инструкция 'return' не работает !!

Я пытался вызвать GetData по ref или out, и оба они не работают ...

1 Ответ

6 голосов
/ 23 февраля 2012

Вам нужно изменить определение массива на 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;
} ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...