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 = &parameters[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 个双打?或者指向双打的指针数组?