处理 Win32 错误

使用互操作方法时,可以使用 GetLastError API 获取有关 API 调用的其他信息。

DllImport 属性 SetLastError 属性

SetLastError =真

表示被调用者将调用 SetLastError(Win32 API 函数)。

SetLastError = FALSE

表示被调用者不会调用 SetLastError(Win32 API 函数),因此你不会收到错误信息。

  • 如果未设置 SetLastError,则将其设置为 false(默认值)。

  • 你可以使用 Marshal.GetLastWin32Error 方法获取错误代码:

例:

[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr OpenMutex(uint access, bool handle, string lpName);

如果你尝试打开不存在的互斥锁,GetLastError 将返回 ERROR_FILE_NOT_FOUND

var lastErrorCode = Marshal.GetLastWin32Error();

if (lastErrorCode == (uint)ERROR_FILE_NOT_FOUND)
{
    //Deal with error         
}

系统错误代码可以在这里找到:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

GetLastError API

你还可以使用本机 GetLastError API:

[DllImport("coredll.dll", SetLastError=true)]
static extern Int32 GetLastError();
  • 从托管代码调用 Win32 API 时,必须始终使用 Marshal.GetLastWin32Error

原因如下:

在设置错误的 Win32 调用(调用 SetLastError)之间,CLR 可以调用其他可以调用 SetLastError 的 Win32 调用,此行为可以覆盖你的错误值。在这种情况下,如果调用 GetLastError ,则可以获得无效错误。

设置 SetLastError = true ,确保 CLR 在执行其他 Win32 调用之前检索错误代码。