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

标签 c# arrays pointers dllimport unmanaged

我已经浏览这个网站很长时间了,并感激地利用了您对其他人问题的回答 - 现在,唉,我必须通过问自己的一个人来暴露我的无知。我搜索了现有的等效项,但找不到;如果这是重复的,我深表歉意。

我正在尝试使用 .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);

...作者对此进行了描述(我的重点):

Returns the data collected by the most recent call to ReadSample(). The returned data is for the data on the package specified by iNode, from the MSR specified by iMSR. The data is returned in pResult, and the number of double results returned in pResult is returned in nResult. Refer Table 1: MSR Functions.

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

关键点:该函数以指向 double 组的指针的形式返回其主要数据 - 或者它是指向 double 的指针数组? ...什么级别的间接?这就是我开始变得不确定的地方! :)

至少一些输入参数很简单; iNodeiMSRint,我知道并且已经可以获取其值。

我已在 C# 代码中使用以下签名声明了该函数:

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

(我确信这是我的第一个错误。)

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

有比我更有知识的人可以建议处理此函数及其返回值的最佳方法吗?

提前谢谢您。

最佳答案

该文档不清楚。由于它是一个要填充多个结果的双*,因此您需要传入一个预先分配的数组 - 但该数组应该有多大? doc说如下:

An MSR’s function, which the API obtains from GetMsrFunc(), determines the amount and meaning of data returned from GetPowerData() as described in Table 1.

表 1 中我们看到:

  • MSR 0:1 双。
  • MSR 1:3 个 double 。
  • MSR 2:2 个 double 。
  • MSR 3:1 双。

因此,一个包含 3 个 double 的数组应该足以容纳所有可能的返回数据。 sample c++ source 证实了这一点这确实是

        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];

参见here有关将数组传递给非托管代码的讨论。

(注意 - 答案未经测试。)

关于c# - C++ 到 C# 的包装 - 如何处理 C# 中的双指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26786892/

相关文章:

C# Generic List<T> - 如何为每个项目随机分配一个 "Rank"?

javascript - 在 Angularjs 中维护表示选项索引的整数数组

arrays - ngStorage 数组在加载时重置

c - C 中的结构数组,告诉我我的成员不在结构或 union 中

尝试从函数传递和返回一组指针时出现 C++ 错误

C 标度整数

c# - 在 C# 中使用 StructLayout 联合

c# - 有没有办法自动确定语句可能抛出的异常?

c# - 我需要做什么才能使此代码在可移植类库中工作?

php foreach 循环行为