我有一個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)如下:它是在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++ DL方法:
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++從C#DLL方法我收到以下錯誤
1 //嘗試讀取或寫入受保護的內存。這通常表示在x64中運行C#代碼時,其他內存已損壞。
2 //當在x86 Active/x86或AnyCPU平臺中運行時,嘗試加載格式不正確的程序。
問題:
1 //上述代碼有什麼問題?
2 //考慮到我的最終目標是在C++中創建一個2d動態數組,並在數組中讀取/寫入數據,例如上面的matrixheader.h文件中的double ** mat?其他方式來實現它?
你是否意識到'Make'返回一個指針到堆棧?這是*非常差* –
那麼我們如何解決這個問題呢?你能否指點我一篇文章,進一步解釋這個錯誤? –
您也可以改爲使用C++/CLI包裝器,並在C#中使用更直接,更清晰的用法。 – crashmstr