C++到C#包装-如何处理C#中的双指针数组

本文关键字:指针 数组 处理 包装 C++ 何处理 | 更新日期: 2023-09-27 18:29:31

我浏览这个网站已经很长时间了&感激地利用你对别人问题的回答——唉,现在我不得不通过问自己的问题来揭露我的无知。我搜索了一个现有的等价物,但找不到;如果这是重复的,我很抱歉。

我正试图在.Net 4.0框架下使用Visual C#Winforms应用程序中的非托管Windows DLL(Intel Power Gadget 3.0 API,FWIW)。API是在考虑C++实现的情况下编写的,所以我必须边翻译边翻译。我已经能够包装和实现库的大多数函数,但被这个函数弄糊涂了:

bool GetPowerData(int iNode, int iMSR, double *pResult, int *nResult);

作者这样描述(我的重点):

返回最近一次对ReadSample()的调用所收集的数据。返回的数据是针对iNode指定的包上的数据,从iMSR指定的MSR数据在pResult中返回,并且pResult中返回的双结果数在n结果请参阅表1:MSR功能。

(https://software.intel.com/en-us/blogs/2014/01/07/using-the-intel-power-gadget-30-api-on-windows)

关键点:函数以指向doubles数组的指针的形式返回其主数据,或者它是指向double的指针数组。。。什么程度的间接性?这就是我开始感到不确定的地方!:)

至少一些的输入参数是简单的iNodeiMSRints,我知道并且已经可以获得其值。

我已经在我的C#代码中用这个签名声明了这个函数:

[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern bool GetPowerData(int iNode, int iMSR, out IntPtr pResult, ref int nResult);

(我确信这是我的第一个错误,就在那里。)

至于实际调用函数,我已经尝试了各种可能性,都太难看了,甚至无法在这里展示。

有人能比我更了解这个函数及其返回值吗?

提前谢谢。

C++到C#包装-如何处理C#中的双指针数组

该文档不清楚。由于它是一个要填充多个结果的double *,因此需要传入一个预分配的数组——但该数组应该有多大?医生说:

API从GetMsrFunc()获得的MSR函数确定了从GetPowerData()返回的数据量和意义,如表1所示。

表1中,我们看到:

  • MSR 0:1双
  • MSR1:3双打
  • MSR2:2双
  • MSR 3:1双

因此,一个包含3个double的数组应该足以容纳所有可能的返回数据。进行的样本c++源证明了这一点

        for (int j = 0; j < numMsrs; j++)
        {
            int funcID;
            energyLib.GetMsrFunc(j, &funcID);
            double data[3];
            int nData;
            wchar_t szName[MAX_PATH];
            energyLib.GetPowerData(currentNode, j, data, &nData);
            energyLib.GetMsrName(j, szName);

所以你会这样声明:

    [DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern bool GetPowerData(int iNode, int iMSR, [In, Out] double [] pResult, out int nResult);

要称之为

    double [] result = new double[3];

有关将数组传递给非托管代码的讨论,请参见此处。

(注意-未测试答案。)

DBC迅速而清晰地发布了正确的答案(从某种意义上说,它对我有效——YMMV!)。以下是我根据DBC的评论使用的内容:

声明:

[DllImport("EnergyLib64.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern bool GetPowerData(int iNode, int iMSR, [In, Out] double[] pResult, out int nResult);

用途:

double[] result = new double[4];
....
bResult = GetPowerData(0, iModeLocal, result, out nResult); // where iModeLocal is an integer that determines the type of data (MSR) I'm interested in

我很久以前没有把这个标记为"已回答"的唯一原因是我没有意识到我没有。哇。很抱歉