Dav*_*way 2 c# arrays pointers unmanaged dllimport
我已经浏览了这个网站很长一段时间并感激你对其他人的问题的答案 - 现在,唉,我必须通过问自己的一个来揭示我的无知.我搜索了一个现有的等价物,却找不到一个; 如果这是重复,我道歉.
我正在尝试使用.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);
Run Code Online (Sandbox Code Playgroud)
......这是作者所描述的(我的重点):
返回最近一次调用ReadSample()收集的数据.返回的数据用于iNode指定的包中的数据,来自iMSR指定的MSR.数据在pResult中返回,并且在nResult中返回pResult中返回的double结果的数量.参见表1:MSR功能.
(https://software.intel.com/zh-cn/blogs/2014/01/07/using-the-intel-power-gadget-30-api-on-windows)
关键点:函数以指向双精度数组的指针的形式返回其主数据 - 或者它是指向双精度的指针数组?......什么级别的间接?这就是我开始变得不确定的地方!:)
至少有一些输入参数很简单; iNode和iMSR是ints,我知道并且已经可以获得它的值.
我已使用此签名在我的C#代码中声明了该函数:
[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)]
static extern bool GetPowerData(int iNode, int iMSR, out IntPtr pResult, ref int nResult);
Run Code Online (Sandbox Code Playgroud)
(我确定这是我的第一个错误,就在那里.)
至于实际调用函数,我尝试了各种各样的可能性,甚至在这里显示都太难看了.
有可能比我的知识更多的人请建议处理此功能及其返回值的最佳方法吗?
先感谢您.
该文件尚不清楚.由于double *要填充多个结果,因此需要传入预分配的数组 - 但该数组应该有多大?该文件说明如下:
API从GetMsrFunc()获取的MSR函数确定从GetPowerData()返回的数据的数量和含义,如表1中所述.
在表1中我们看到:
因此,3个双精度数组应足以容纳所有可能的返回数据.这是由证实了样品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);
Run Code Online (Sandbox Code Playgroud)
所以你会声明它:
[DllImport("EnergyLib32.dll", CallingConvention = CallingConvention.Cdecl)]
static extern bool GetPowerData(int iNode, int iMSR, [In, Out] double [] pResult, out int nResult);
Run Code Online (Sandbox Code Playgroud)
并称之为,使用
double [] result = new double[3];
Run Code Online (Sandbox Code Playgroud)
有关将数组传递给非托管代码的讨论,请参见此处.
(注意 - 答案未经测试.)