virus131 Ответов: 1

Как передать struct с 2-мерным целым числом и двойным массивом из C# в C++ DLL


Привет,

У меня есть VC++ dll, имеющая нижеприведенную структуру

значение структуры
{
инт RunInchMm;
инт transform_order;
инт rotation_ang;
int rotation_org[2][2];
инт mirror_xchg_code;
инт absincmode;
двойной WCS [6][4];
};

Я использую эту структуру в качестве параметра для моей функции VC++ dll, где я читаю все значения из структуры.

Я вызываю эту Dll и ее функцию из приложения c# и передаю значения в структуру из приложения C#, но я не получаю правильных значений для массивов в dll (но для целых чисел я получаю правильные значения) .

Я не знаю, почему это так?

Моя структура из C# выглядит следующим образом-

[StructLayout(LayoutKind.Последовательный)]
значение публичной структуры
{
[Помощью Атрибута Marshalas(Unmanagedtype Значение.И4)]
public int RunInchMm;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.И4)]
общественная int transform_order;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.И4)]
общественная int rotation_ang;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.ByValArray)]
public int [,] rotation_org;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.И4)]
общественная int mirror_xchg_code;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.И4)]
public int absincmode;
[Помощью Атрибута Marshalas(Unmanagedtype Значение.ByValArray)]
общественные двойной[,] туалетами;
}

Я использую dll в C# как-

[DllImport("Convert.dll")]
публичный статический модификатор extern int и ConvertFunc(инт prognum, Реф значение WincncVal, строки имя_проекта, инт fromrunormdi);

// Создать объект структуры

Value WincncVal = новое значение();
WincncVal.rotation_org = новый интервал[2, 2];
Винкнквал.WCS =новый двойной [6,4];

Винкнквал.RunInchMm = 5;

WincncVal.transform_order = 10;
WincncVal.rotation_ang = 12;

WincncVal. rotation_org[0, 0] = 2;
WincncVal.rotation_org[0, 1] = 3;
WincncVal.mirror_xchg_code = 6;
WincncVal.absincmode = 4;

for (int i = 0; i < 6; i++)
for (int j = 0; j < 4; j++)
Винкнквал.WCS[i, j] = 1.1;

ConvertFunc(9999, ref WincncVal, "eWinCNC", 0);

Я много гуглил, но не получал правильного решения.

Пожалуйста, помогите мне.

Спасибо....

Что я уже пробовал:

Я попытался использовать указатели, но безуспешно.

		    
                    

1 Ответов

Рейтинг:
2

Luc Pattyn

Многомерные массивы трудно передать между управляемыми и неуправляемыми мирами.

Ваш

int rotation_org[2][2]; 
в C# world на самом деле есть три объекта: один для матрицы и один для каждого из ее столбцов. В то время как ваш неуправляемый код C++ видит только один объект, все ячейки матрицы будут находиться в соседних ячейках памяти, как если бы был задан одномерный массив.

Самый простой способ транспортировки матриц-это использование одномерных массивов!!