Маршалирование структуры, содержащей массив, из С# в библиотеку на С++
Пытаюсь в DLL, написанную на С++, отправить структуру из программы на С#, а затем получить назад структуру с измененными значениями. В структуре имеется массив. При упаковке и запаковке возникает исключение вида: System.Runtime.InteropServices.SafeArrayRankMismatchException: "Невозможно упаковать массив SafeArray в массив этого типа, так как он имеет ненулевую нижнюю границу или более одного измерения." Подскажите, как правильно работать со структурами в таком случае? Код С# части
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace MyCode
{
class Program
{
[DllImport("D:\\Dll3\\Release\\Dll3.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ResCall(IntPtr ptr);
static void Main(string[] args)
{
MarshTest marshTest = new MarshTest();
marshTest.Init();
marshTest.i32Val = 2;
marshTest.dVal = 2.0;
marshTest.mass[0] = 0;
marshTest.mass[0] = 1;
marshTest.mass[0] = 2;
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(marshTest));
Marshal.StructureToPtr(marshTest, ptr, false);
ResCall(ptr);
marshTest = (MarshTest)Marshal.PtrToStructure<MarshTest>(ptr);
Console.WriteLine("marshTest.i32Val = " + marshTest.i32Val+"\n"+ "marshTest.dVal = " + marshTest.dVal);
Console.WriteLine("mass " + marshTest.mass[0] + " " + marshTest.mass[1] + " "+ marshTest.mass[2]);
Console.ReadKey();
}
[StructLayout(LayoutKind.Sequential)]
public struct MarshTest
{
public Int32 i32Val;
public double dVal;
public int[] mass;
public void Init()
{
mass = new int[3];
}
}
}
}
Код библиотеки С++
#ifndef PCH_H
#define PCH_H
#endif
#include "framework.h"
struct MarshTest
{
public:
long i32Val;
double dVal;
long* mass;
void Init()
{
mass = new long[3];
}
};
void ResCall(void* ptr)
{
MarshTest* mt = (MarshTest*)ptr;
mt->Init();
mt->i32Val = 111;
mt->dVal = 9.8696;
mt->mass[0] = 1;
mt->mass[1] = 1;
mt->mass[2] = 1;
}
#pragma once
#ifndef __TESTDLL_H
#define __TESTDLL_H
#ifdef TESTDLL_EXPORTS
#define DLL_SPEC extern "C" __declspec(dllexport)
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif
DLL_SPEC void ResCall(void* ptr);
#endif