首页 > 解决方案 > 如何在 C# 中 P/Invoke 具有未知结构的函数?

问题描述

我知道这听起来很奇怪,但我什至不知道如何正确地问这个问题。我一直在尝试 P/Invoke 到 NVidia 的 NVML 库中,但成功有限:我设法调用了该库导出的一些 API

现在我正在尝试打电话nvmlDeviceGetHandleByIndex_v2,但我已经被困在这个电话上很长时间了。它接受一个nvmlDevice_t指针,但我没有发现任何nvmlDevice_t超出此标头定义的内容:

typedef struct nvmlDevice_st* nvmlDevice_t;

问题是头文件没有进行任何其他引用,nvmlDevice_st所以我不知道要为其分配多少堆空间(如果有的话)。我发现这个官方的 C++ 示例调用相同的函数,如下所示:

nvmlDevice_t device;
CheckNVMLErrors(nvmlDeviceGetHandleByIndex(device_index, &device));

我的主要问题是我对 C/C++ 不够熟悉,无法理解device声明完成的隐式机制/内存分配,并且nvml.h标题没有定义nvmlDevice_st实际是什么。

我尝试使用ref int参数(带有初始0值)调用它,显然它确实有效,但我想了解原因,如果可能的话。作为参考,ref int调用后该参数的值是1460391512,以防可以从中发现一些东西。

标签: c#c++c

解决方案


如果您查看源代码,那只是 SDK 使用的内部指针。它指向的值对你没有意义。您可以使用它来识别您正在使用的设备。

想想Handle还是HWND在 Windows 中。你调用类似的东西FindWindow(),它会返回一个似乎是随机值的东西给你。您不关心该值是什么,您只需在调用GetWindowText()或任何其他窗口方法时使用该值来识别该窗口。

因此,您使用 using 走在正确的轨道上ref int,但您想要的是一个指针。所以你应该使用out IntPtr来获取价值。


推荐阅读