Что ж, ваша проблема в (int) приведении буфера.Оператор + отличается от int и IntPtr.Посмотрите на следующее:
for (int i = 0; i < Count; i++)
{
IntPtr newPtr = buffer + i * sizeof(typeof(MyStruct));
ru[i] = (MyStruct)Marshal.PtrToStructure(newPtr, typeof(MyStruct));
}
Я не проверял это, и я не знаю, правильно ли и правильно ли размещено содержимое вашего IntPtr, но именно так вы должны проходить по массиву структур.
Что касается проблемы с маршалингом, маршалинг определяется IDL, поэтому, пожалуйста, проверьте определение вашего массива.Я не уверен (массивы всегда смущали меня), но мне кажется, что у вас слишком много одного измерения.Попробуйте следующее (и, пожалуйста, дайте мне знать, если один правильный):
[out,size_is(pnCnt)] MyStruct** ppArr
[out,size_is(*pnCnt)] MyStruct* ppArr