У меня есть следующий код C # с определением структуры (CInput), определением obj и init, а также вызовом функции C ++ (нативной) DLL (также написанной мной).
//C# code
public struct CInput
{
[MarshalAsAttribute(UnmanagedType.R8)]
public double Time;
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_R8)]
public double[] Database;
/* other similar fields*/
}
CInput Inputs = new CInput();
/* init of Inputs fields*/
int bfr = Example(ref Inputs); //'Example' being the C++ DLL call
Messagebox.Show(bfr.ToString());
Произошла ошибка при маршалинге второго параметра, я не знаю, где.Тогда:
//C++ code
struct CInput {
double Time;
double Database[3650];
/*etc*/
}
int Example(CInput& ObjIn) {
return ObjIn.Database[0]; // just an example
}
Если я не буду осторожен и укажу только «SafeArray» в маршалинге базы данных, я получаю «ошибку при чтении / записи памяти, возможно, поврежден» и т. Д.
если«База данных» была упорядочена, поскольку ByValArray все в порядке, значения отображаются правильно.К сожалению, я получаю исключение внутреннего размера, потому что у меня много массивов такого размера, поэтому я должен пойти на указатели - но все, что с "SizeArray" даст следующие результаты (с только что опубликованным кодом):
(из C ++):
Database[0] = **0**
Database[1..etc] = values of the next parameters in the struct marshaled with ByValArray.
Думаю, я должен упомянуть, что мне нужна такая же идентичная структура от C # до C ++, я не ищу ничего фантастического.Так что Array in Struct >>> Array in Struct.
ANY понимание в отношении этого было бы очень полезно.Я искал часы, и у меня пока нет решения.
Большое спасибо заранее.