转换时
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool QueryServiceStatusEx(SafeHandle hService, int infoLevel, IntPtr lpBuffer, uint cbBufSize, out uint pcbBytesNeeded);
通过最新的 VisualStudio 2022 相当于 LoadLibrary
[LibraryImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static partial bool QueryServiceStatusEx(SafeHandle hService, int infoLevel, IntPtr lpBuffer, uint cbBufSize, out uint pcbBytesNeeded);
使用 Marshal.GetLastWin32Error() 检索最后一个错误始终返回 0。
调试显示正确的错误代码在函数调用结束时可用,但丢失了 一步之后。这可能与 LibraryImport 不安全上下文有关
这是可重现的:
// 1st call to get the required size of the output buffer.
NativeMethods.QueryServiceStatusEx(ServiceHandle, SC_STATUS_PROCESS_INFO /*0*/, zero, 0, out uint dwBytesNeeded);
int err = Marshal.GetLastWin32Error();
//For DllImport: err == 122 (ERROR_INSUFFICIENT_BUFFER as expected)
//For LibraryImport: err == 0
有什么建议吗?
我已重试 QueryServiceStatusEx 的 LoadLibrary 属性,但这一次它有效(独立于附加的调试器)。 现在,所有错误代码(Marshal.GetLastWin32Error、Marshal.GetLastSystemError 和 Marshal.GetLastPInvokeError)在第一次调用时显示相同的预期结果 122。
我只能猜测为什么它第一次不起作用。从那时起,这些是我所做的唯一行动: