Передайте массив Struct ByRef из C # в C ++ и получите его обратно - PullRequest
0 голосов
/ 24 апреля 2018

У меня очень странная проблема при вызове 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]
  • читайте другие вопросы, но ни у одного из них не было этой проблемы.

Кто-нибудь имеет представление о том, что я пропустил?

Заранее спасибо!

1 Ответ

0 голосов
/ 24 апреля 2018

Я решил проблему.

Я удалил ref из DllImport и поместил декоратор [MarshalAs(UnmanagedType.LPArray)] и [In, Out] в MyStruct параметр.

Наконец, я изменился на void * paramStruct в C ++ и, наконец, все заработало!

...