У меня очень странная проблема при вызове dll CPP.
Я могу вызвать метод, передающий структурный массив (с несколькими позициями), маршалировать и зацикливать его, а также устанавливать для него данные. Но когда код возвращается на C #, массив имеет только одну позицию.
Например, я создаю массив своей структуры с 3 позициями (0, 1, 2), в C ++ Dll я получаю весь массив и ничего с ним не делаю, и когда выполнение возвращается к C # Caller, массив имеет только одну позицию в массиве с первым элементом.
Код:
C ++ сторона:
extern "C" __declspec(dllexport) int ViewItems(int * nTotalItems, void ** paramStruct)
{
// TODO nothing here.
return 1;
}
C # сторона:
[DllImport(@"MyCustomLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int ViewItems(ref int resultItemsCount, ref MyStruct[] MyStruct);
Вызывать:
var resultSize = 3;
var resultStruct = new MyStruct[3];
for (int i = 0; i < resultSize; i++)
{
resultStruct[i].SomePropValue = i+2;
}
// Before this, the resultStruct.Lenght is 3
var resultCall = ViewItems(ref resultSize, ref resultStruct);
// After this, the resultStruct.Lenght is
Struct:
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
public int SomePropValue;
}
Я попробовал следующее безуспешно:
- [MarshalAs (UnmanagedType.LPArray)]
- [In, Out]
- читайте другие вопросы, но ни у одного из них не было этой проблемы.
Кто-нибудь имеет представление о том, что я пропустил?
Заранее спасибо!