處理 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 呼叫之前檢索錯誤程式碼。