Маршалирование структуры, содержащей массив, из С# в библиотеку на С++

Пытаюсь в 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

Ответы (0 шт):