【问题标题】:How to log meaningful error messages while using P/Invoke如何在使用 P/Invoke 时记录有意义的错误消息
【发布时间】:2025-12-26 04:15:07
【问题描述】:

在使用P/Invoke 调用本机函数时,我得到了三种不同的返回/错误/状态代码类型。

  1. 第一个是我通过调用Marshal.GetLastWin32Error 静态方法得到的常见错误代码。

  2. 第二个是 HRESULT 我在调用一些 COM 辅助函数时得到的。

  3. 第三个是NTSTATUS 我从 ntdll.dll 库调用本机 api 时得到的。我有一个日志功能,将返回/错误/状态代码记录为十六进制数字,然后当在日志中发现错误时,我需要使用 google 找出实际错误是什么。

所以我想问一下是否有一种好方法可以将这些返回/错误/状态代码转换为字符串(最好是英文)以记录返回/错误/状态字符串描述而不是数字?

有没有办法在LastError/HRESULT/NTSTATUS 代码之间进行转换,以使错误消息的语义保持不变?

【问题讨论】:

  • 不将这些错误视为异常是很成问题的,没有什么好事发生,你可以耸耸肩的几率应该很低。请考虑抛出异常,您始终可以登录 catch 处理程序。 Win32 异常由 Win32Exception 产生,无需调用 GetLastWin32Error()。 COM 异常是使用 Marshal.ThrowExceptionForHR() 生成的。他们都做为错误获取文本表示的工作。 NTSTATUS 代码很棘手,因为它们通常由特定模块生成,您必须调用 FormatMessage()。
  • 恕我直言,没有灵丹妙药。 FormatMessage 通常很有用,正如这里在 SO 上解释的那样:*.com/questions/7008047/… 否则我建议使用这个在线免费工具(我最近在 20 多年后与你有同样的问题),它比随机谷歌搜索要好得多:magnumdb.com 它会帮你按名称或按代码名称的错误代码等以及定义它的.h文件等。

标签: c# logging pinvoke


【解决方案1】:

您可以为此目的使用errorlook tools。这个链接有点老了,我是在我以前的 VC++ 时代学到的,你可以用它作为寻找现代工具的起点。

至于日志记录,我建议您保留原始错误代码。有意义的错误信息更容易阅读,但原始错误代码是搜索引擎的准确关键字。

【讨论】: