У меня есть C++ класс, который имеет заголовок (matrixheader.h) таким образом, что:Чтение Запись C++ Динамические массивы в C# (InteropServices)
#pragma once
class M
{
public:
M(int m,int n);
void MSet(int m,int n,double d);
double MGet(int m,int n);
~M();
private:
double** mat;
};
класса определяется следующим образом в (matrixbody.cpp): It встроен в платформу Win32.
#pragma once
#include "matrixhead.h"
M::M(int m,int n)
{
mat = new double*[m];
for (int i = 0; i < m; i++)
{
mat[i] = new double[n];
}
}
void M::MSet(int m,int n,double d)
{
mat[m][n] = d;
}
double M::MGet(int m,int n)
{
double d = mat[m][n];
return d;
}
M::~M()
{
delete[] mat;
}
Я сделал обертку для класса как так (matrixwrapper.cpp): Оболочка также встроена в платформу Win32.
#include "matrixhead.h"
#include "matrixbody.cpp"
extern "C" __declspec(dllexport) void* Make(int m,int n)
{
M o(m,n);
return &o;
}
extern "C" __declspec(dllexport) void setData(void* mp,int m,int n,double d)
{
M* ap = (M*)mp;
M a = *ap;
a.MSet(m,n,d);
}
extern "C" __declspec(dllexport) double getData(void* mp,int m,int n)
{
M* bp = (M*)mp;
M b = *bp;
double d = b.MGet(m,n);
return d;
}
импортировать класс в C# и попытаться вызвать C++ методы Д.Л. из C#:
using System;
using System.Runtime.InteropServices;
namespace wrappertest
{
class Program
{
[DllImport("matrixwrapper.dll")]
unsafe public static extern void* Make(int m,int n);
[DllImport("matrixwrapper.dll")]
unsafe public static extern void setData(void* mp,int m, int n,double d);
[DllImport("matrixwrapper.dll")]
unsafe public static extern double getData(void* mp,int m, int n);
static unsafe void Main(string[] args)
{
void* p = Make(10, 10);
setData(p,10,1,10);
Console.WriteLine(getData(p,10,1));
}
}
}
Но когда я пытаюсь запустить C++ методы DLL из C# я получаю следующее сообщение об ошибке
1 // Попытка чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена при запуске кода C# в x64.
2 // Была предпринята попытка загрузить программу с неправильным форматом при запуске в x86 Active/x86 или на платформе AnyCPU.
Вопросы:
1 // Что плохого в приведенном выше коде?
2 // Учитывая, что моя конечная цель состоит в том, чтобы сделать 2d динамический массив на C++ и читать/записывать данные в массиве, такие как один двойной ** мат в файле matrixheader.h выше из C#? Есть ли какие-либо другой способ его реализовать?
Вы понимаете, что 'Make' возвращает указатель на стек? Это очень * плохо ... –
Итак, как мы это исправим? Можете ли вы указать мне статью, в которой объясняется эта ошибка? –
Вы также можете сделать оболочку C++/CLI и иметь более прямое и чистое использование в C#. – crashmstr