C# 调用 C 并将参数作为指向数组的指针传递
C# call to C and pass parameter as a pointer to an array
我有一个具有以下签名的 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** 转换为 < CppImplementationDetails >$ArrayType ....
如有任何帮助,我们将不胜感激。
谢谢,
你好,
Sorin
如果您已经有一个 C++/CLI 包装器,我会调整那里的 API 并使其成为 C#-ish。
因此将 C++/CLI 声明更改为如下内容:
int MyFunc(array<double>^ points,
array<double>^ parameters);
然后在该实现中执行所有托管-> 非托管包装。
最后,它看起来像这样:
int MyFunc(array<double>^ points,
array<double>^ parameters)
{
if (points->Length != 3)
{
throw gcnew System::ArgumentOutOfRangeException("Expecting exactly 3 points");
}
double *pPoints = (double*)alloca(sizeof(double) * points->Length);
for (int i = 0; i < points->Length; i++)
{
pPoints[i] = points[i];
}
double* pParams = (double*)alloca(sizeof(double) * parameters->Length);
for (int i = 0; i < parameters->Length; i++)
{
pParams[i] = parameters[i];
}
double(*pPoints3)[3] = (double(*)[3])pPoints;
int numParams = parameters->Length;
my_func(pPoints3, pParams, &numParams);
}
但是,我对 ???因为我不完全知道 const double(*pPoints3)[3]
是什么意思。一组 3 个双打?或者指向双打的指针数组?
我有一个具有以下签名的 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** 转换为 < CppImplementationDetails >$ArrayType ....
如有任何帮助,我们将不胜感激。
谢谢,
你好,
Sorin
如果您已经有一个 C++/CLI 包装器,我会调整那里的 API 并使其成为 C#-ish。
因此将 C++/CLI 声明更改为如下内容:
int MyFunc(array<double>^ points,
array<double>^ parameters);
然后在该实现中执行所有托管-> 非托管包装。
最后,它看起来像这样:
int MyFunc(array<double>^ points,
array<double>^ parameters)
{
if (points->Length != 3)
{
throw gcnew System::ArgumentOutOfRangeException("Expecting exactly 3 points");
}
double *pPoints = (double*)alloca(sizeof(double) * points->Length);
for (int i = 0; i < points->Length; i++)
{
pPoints[i] = points[i];
}
double* pParams = (double*)alloca(sizeof(double) * parameters->Length);
for (int i = 0; i < parameters->Length; i++)
{
pParams[i] = parameters[i];
}
double(*pPoints3)[3] = (double(*)[3])pPoints;
int numParams = parameters->Length;
my_func(pPoints3, pParams, &numParams);
}
但是,我对 ???因为我不完全知道 const double(*pPoints3)[3]
是什么意思。一组 3 个双打?或者指向双打的指针数组?