Структуры в 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);