【发布时间】:2015-03-13 20:51:55
【问题描述】:
我有一个 C++ 类,它有一个 header(matrixheader.h),这样:
#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 动态数组并在数组中读取/写入数据,例如上面来自 C# 的 matrixheader.h 文件中的一个 double**mat?还有其他的吗?如何实现它?
【问题讨论】:
-
你知道
Make返回一个指向栈的指针吗?这非常很糟糕...... -
那么我们该如何解决这个问题呢?你能给我指出一篇进一步解释这个错误的文章吗?
-
您也可以创建一个 C++/CLI 包装器,并在 C# 中使用更直接、更简洁。
-
顺便说一句,您的矩阵类泄漏内存,请使用
std::vector代替动态数组。或者至少确保在删除父数组之前也删除所有子数组。最好的选择就是在 C# 中创建数组,这里不需要 C++。 -
@Aditya 在 C# 中,
var test = new int[10000 * 10000];工作得很好。
标签: c# c++ dllimport dllexport interopservices