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

C++;到C#包装-如何处理来自C的双指针数组#,c#,arrays,pointers,dllimport,unmanaged,C#,Arrays,Pointers,Dllimport,Unmanaged,我浏览这个网站已经很长时间了&感激地利用你对其他人问题的回答——现在,唉,我不得不通过问我自己的问题来揭示我的无知。我搜索了一个现有的等价物,但没有找到;如果这是重复的,我道歉 我正试图在.Net 4.0框架下使用Visual C#Winforms应用程序中的非托管Windows DLL(Intel Power Gadget 3.0 API,FWIW)。API是用C++实现的,所以我必须在我的翻译中进行翻译。我已经能够包装和实现该库的大部分功能,但我对这个功能感到困惑: bool GetPowe

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

我正试图在.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功能

()

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

至少一些输入参数是简单的;iNode和iMSR是
int
s,我知道并且已经可以获得它们的值

我在我的C#代码中声明了具有以下签名的函数:

[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)]
    static extern bool GetPowerData(int iNode, int iMSR, out IntPtr pResult, ref int nResult);
(我肯定这是我的第一个错误,就在这里。)

至于实际调用这个函数,我已经尝试了各种各样的可能性,都太难看了,这里甚至没有显示出来

能不能请比我更了解这个函数的人提出处理这个函数及其返回值的最佳方法


提前谢谢。

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

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

表1中,我们看到:

  • MSR 0:1双精度
  • MSR 1:3双打
  • MSR 2:2双打
  • MSR 3:1双
因此,一个3个双精度数组应该足以容纳所有可能的返回数据。这一点得到了事实的证明

        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);
要称呼它,请使用

    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

很久以前我没有将此标记为“已回答”的唯一原因是我没有意识到我没有。哎呀。对不起。

指针和数组(几乎)都是在C++中,同样的原因是,一个双倍数组被返回为<代码>双*<代码>。请看RSENA,为您的快速和有益的响应。链接的文章是对C++中的数组的一个更好的解释。不幸的是,你认为我比这更具说服力。事实上,我将继续研究。ch:)不客气!:)这是当时我能提供的最好的,希望能有所帮助。是的,这帮助我了解更多。再次感谢。来自未来的观众朋友们——下面的“DBC”给出了正确的答案;我已经证实它是有效的。我希望这对你有好处,谢谢。这非常有效,我现在可以通过GetPowerData()调用获取值。我真的很感激你清晰明了的解释!
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