Структуры в unmanaged dll - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! В проекте производится много вычислений. Хочу написать unmanaged dll для ускорения. На плюсах никогда не кодил толком. Функции, типа сложения двух чисел, одолел. Но мне надо в dll заполнить структуру. Как пытаюсь: С++ заголовок
   typedef struct
    {
      double point[3];
    } ZVertex;
 
   typedef struct
    {
      ZVertex* vertexes;
    } ZEdge;
 
    extern "C" { __declspec(dllexport) int GetEdge(ZEdge * edge); }
cpp
    int GetEdge(ZEdge * edge)
    {
        edge->vertexes=new ZVertex[2];
        ZVertex vert1;
        vert1.point[0]=1;
        vert1.point[1]=2;
        vert1.point[2]=3;
        edge->vertexes[0]=vert1;
        ZVertex vert2;
        vert2.point[0]=10;
        vert2.point[1]=20;
        vert2.point[2]=30;
        edge->vertexes[1]=vert2;
        return 0;
    }
Все нормально компилится. Вызываю из шарпа
        [DllImport("FuncDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetEdge(ZEdge edge);
        public struct ZVertex
        { 
            public double[] point;
        }
        public struct ZEdge
        {
            public ZVertex[] vertexes;
        }
 
        static void Main(string[] args)
        {
            ZEdge z = new ZEdge();
            GetEdge(z);
            Console.ReadLine();
        }
Получаю "Попытка чтения или записи в защищенную память" Что-то делаю не так. А что? Вызываю неправильно, или вопрос лучше в ветку с++?

Решение задачи: «Структуры в unmanaged dll»

textual
Листинг программы
        public struct ZVertex
        { 
            [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
            public double[] point;
        }
 
        public struct ZEdge
        {
            public IntPtr vertexes;
        }
 
        [DllImport("FuncDll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int GetEdge(ref/*или out*/ ZEdge edge);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы