Структуры в unmanaged dll - C#
Формулировка задачи:
Доброго времени суток!
В проекте производится много вычислений. Хочу написать unmanaged dll для ускорения.
На плюсах никогда не кодил толком. Функции, типа сложения двух чисел, одолел.
Но мне надо в dll заполнить структуру. Как пытаюсь:
С++
заголовок
cpp
Все нормально компилится.
Вызываю из шарпа
Получаю "Попытка чтения или записи в защищенную память"
Что-то делаю не так. А что? Вызываю неправильно, или вопрос лучше в ветку с++?
typedef struct { double point[3]; } ZVertex; typedef struct { ZVertex* vertexes; } ZEdge; extern "C" { __declspec(dllexport) int GetEdge(ZEdge * edge); }
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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д