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