【发布时间】:2021-08-31 02:56:45
【问题描述】:
我有一个带有以下签名的 C 方法:
extern __declspec(dllexport) int my_func
(const double(*points)[3], double parameters[MAXPARS], int* numberofparameters);
此函数是 .lib 的一部分,我将其包装在用 C++ 编写的 DLL (CLR/CLI) 中,以便我可以从 C# 调用。 C++方法的签名类似:
int MyFunc(const double(*points)[3],
double parameters[MAXPARS],
int* numberofparameters)
现在我的困难是如何从 C# 调用这个方法。问题是第一个参数,const double(*points)[3],不知道怎么传。 我在 C# 中的代码如下所示:
double[,] pts = new double[1,3];
pts[0, 0] = 1.5;
pts[0, 1] = 2.5;
pts[0, 2] = 3.5;
double[] parameters = new double[4];
int nrParams;
unsafe {
fixed (double *points = pts) {
fixed (double* para = ¶meters[0]) {
wrapper.MyFunc(&points, para, &nrParams);
}
}
}
这显示了错误: 参数 1:无法从 double** 转换为 $ArrayType ....
任何帮助将不胜感激。
谢谢,
您好,
Sorin
【问题讨论】:
-
C 还是 C++?你在标题中说 C,你说你“有一个 C 方法”,然后你说 C++,你也标记了 C++。
-
对,因为我将 C 方法包装到 C++ DLL 中,就像我说的那样; C++ 方法与 C 方法具有相同的签名
-
double parameters[MAXPARS]- 注意给定的长度参数被完全忽略,表达式等价于double parameters[]或double* parameters。如果您出于文档目的而意识到这一点,那很好,但是您的进一步期望不会得到满足。还要注意,第一个参数在这方面有所不同(指向大小为 3 的数组的指针)。 -
在 C 或 C++ 中是一样的:
double* p = ...; double** pp = &p; /* fine */; double a[3]; double (*pa)[3] = &a; /* fine */; pp = &a; /* differing pointer types! */ pa = &p; /* differing pointer types */ -
问题是如何从 C# 调用它
标签: c# c++ c marshalling