Как использовать библиотеку Libre Hardware Monitor для чтения датчиков графического процессора - PullRequest
0 голосов
/ 02 марта 2019

Я пишу простое приложение на C # с использованием библиотеки Libre Hardware Monitor.Все отлично работает, кроме датчиков GPU.Если для GPUEnabled установлено значение "true", я получаю следующее сообщение:

Managed Debugging Assistant 'PInvokeStackImbalance' : 
'A call to PInvoke function'OpenHardwareMonitorLib!OpenHardwareMonitor.Hardware.
Nvidia.NVAPI+NvAPI_GetInterfaceVersionStringDelegate::Invoke' has unbalanced the stack. 
This is likely because the managed PInvoke signature does not match the unmanaged target
signature. Check that the calling convention and parameters of 
the PInvoke signature match the target unmanaged signature.'

в файле NVAPI.cs 335. строка

public static NvStatus NvAPI_GetInterfaceVersionString(out string version) {
      StringBuilder builder = new StringBuilder(SHORT_STRING_MAX);
      NvStatus status;
      if (_NvAPI_GetInterfaceVersionString != null)
/*335*/ status = _NvAPI_GetInterfaceVersionString(builder);
      else
        status = NvStatus.FUNCTION_NOT_FOUND;
      version = builder.ToString();
      return status;
    }

с Libre Hardware Monitor все отлично работает.
GPU: ASUS-ROG-STRIX-RTX2080-O8G-GAMING
Мой код (в основном с здесь ):

Computer thisPC;

public EMSSettings()
{
    InitializeComponent();

    thisPC = new Computer()
    {
        GPUEnabled = true
    };

    thisPC.Open();
}

private void timer1_Tick(object sender, EventArgs e)
{

    String temp = "";

    foreach (var hardwareItem in thisPC.Hardware)
    {
        if (hardwareItem.HardwareType == HardwareType.CPU || true)
        {
            hardwareItem.Update();
            foreach (IHardware subHardware in hardwareItem.SubHardware)
                subHardware.Update();

            foreach (var sensor in hardwareItem.Sensors)
            {
                if (sensor.SensorType == SensorType.Temperature || true)
                {

                    temp += String.Format("{0} Temperature = {1}\r\n", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value");

                }
            }
        }
    }

    textBox1.Text = temp;

}

Спасибо всем заответы

1 Ответ

0 голосов
/ 04 марта 2019

Ответ здесь: https://stackoverflow.com/a/39203588/9355850
Добавьте [UnmanagedFunctionPointer(CallingConvention.Cdecl)] перед каждым делегатом.

...