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
相关产品推荐
相关产品推荐

