You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibraryImport替换DllImport后Marshal.GetLastWin32Error()始终返回0求助

解决LibraryImport替换DllImport后无法获取Win32错误码的问题

问题原因

LibraryImport是.NET 6+引入的新P/Invoke机制,和传统DllImport在Win32错误码的存储、读取逻辑上存在差异。直接用Marshal.GetLastWin32Error()无法正确捕获LibraryImport调用后的错误码,导致返回值始终为0。

解决方案

1. 替换错误码获取方法

把Marshal.GetLastWin32Error()换成Marshal.GetLastPInvokeError(),这个方法是专门为新P/Invoke机制设计的,能准确获取LibraryImport调用后的Win32错误码。

修改后的测试代码:

// 第一次调用获取输出缓冲区所需大小
NativeMethods.QueryServiceStatusEx(ServiceHandle, SC_STATUS_PROCESS_INFO /*0*/, IntPtr.Zero, 0, out uint dwBytesNeeded);

int err = Marshal.GetLastPInvokeError();

// 此时err会正确返回122 (ERROR_INSUFFICIENT_BUFFER)

2. 异常抛出(可选)

如果需要将错误码直接转为异常抛出,可使用以下代码:

Marshal.ThrowExceptionForHR(Marshal.GetLastPInvokeError());

补充说明

  • 务必保留LibraryImport声明中的SetLastError = true,这是运行时捕获错误码的必要前提。
  • 原声明里的[return: MarshalAs(UnmanagedType.Bool)]无需修改,它保证了bool返回值的正确封送。

内容的提问来源于stack exchange,提问作者TomB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 09:32:43