С вдохновение от проекта OpenHardwareMonitor я сделал себе хороший гаджет для мониторинга CPU и метрики GPU температуры, нагрузки и т.д.Вызов неуправляемого кода из C#
Он отлично работает, но я бегу в к PInvokeStackImbalance
предупреждения при вызове методов драйвера NVidia и не думаю, что их игнорировать не стоит.
Однако после нескольких недель экспериментов (с поддержкой NVidia Documentaion) я до сих пор не могу понять, как определить и использовать Drivers Structs and Methods таким образом, чтобы VS 2015 был доволен - что странно, потому что есть никаких предупреждений в проекте OpenHardwareMonitor, несмотря на то, что он использует тот же самый код.
Надеюсь, кто-то здесь может указать мне в правильном направлении.
[DllImport("nvapi.dll", CallingConvention = CallingConvention.Cdecl, PreserveSig = true)]
private static extern IntPtr nvapi_QueryInterface(uint id);
private delegate NvStatus NvAPI_EnumPhysicalGPUsDelegate([Out] NvPhysicalGpuHandle[] gpuHandles, out int gpuCount);
private static readonly NvAPI_EnumPhysicalGPUsDelegate NvAPI_EnumPhysicalGPUs;
NvAPI_EnumPhysicalGPUs = Marshal.GetDelegateForFunctionPointer(nvapi_QueryInterface(0xE5AC921F), typeof(NvAPI_EnumPhysicalGPUsDelegate)) as NvAPI_EnumPhysicalGPUsDelegate;
status = NvAPI_EnumPhysicalGPUs != null ? NvAPI_EnumPhysicalGPUs(PhysicalGPUHandles, out PhysicalGPUHandlesCount) : NvStatus.FUNCTION_NOT_FOUND; // warning is thrown here
Bingo! Я не знал, что вы можете указать соглашение о вызовах для делегатов, я добавил это всем делегатам и не стал больше предупреждать! – VikFreeze