LibraryImport 导致 Marshal.GetLastWin32Error() 始终返回 0

问题描述 投票:0回答:1

转换时

[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

有什么建议吗?

c# dll marshalling
1个回答
0
投票

我已重试 QueryServiceStatusEx 的 LoadLibrary 属性,但这一次它有效(独立于附加的调试器)。 现在,所有错误代码(Marshal.GetLastWin32Error、Marshal.GetLastSystemError 和 Marshal.GetLastPInvokeError)在第一次调用时显示相同的预期结果 122。

我只能猜测为什么它第一次不起作用。从那时起,这些是我所做的唯一行动:

  • 重新启动 Visual Studio(也许自动选中的“不安全代码”选项没有通过)
  • 完全重建项目,并手动删除所有 bin 和 obj 文件夹
© www.soinside.com 2019 - 2024. All rights reserved.