处理 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 调用之前检索错误代码。