2009-10-12 90 views

回答

9

使用P/Invoke可以安全地說有兩種錯誤需要處理。

  1. P/Invoke本身引發的異常。通過DLL的返回
  2. 錯誤要調用/

隨着1組有一對夫婦可能發生異常(不是最終名單):

  • EntryPointNotFoundException
  • ExecutionEngineException
  • MissingMethodException
  • NotSupportedException

對於第2組,您需要檢查P/Invoked方法/函數調用的返回結果並採取適當的行動。 Marshal.GetLastWin32Error()在這裏派上用場。

這就是爲什麼總是最好爲您需要使用的任何本地材料創建包裝類。通過這種方式,您可以將返回結果轉換爲異常,並將託管代碼和本機代碼分開。

4

我不知道是否有可以拋出的異常的一個明確的清單,但我知道至少有以下可能會出現

  • AccessViolationException
  • StackOverflowException
  • 異常時,DLL命名未找到。不記得了我的頭
  • OutOfMemoryException異常

的最上面的這些異常類型都是不特定的PInvoke,並可以在程序中的任何一點發生的類型。唯一特定於PInvoke調用的是未發現的DLL異常(誰是我不記得的類型)。

3

另外:

  • DllNotFoundException
  • BadImageFormatException(DLL是錯誤的格式或損壞)
  • MethodAccessException(嘗試通過安全透明方法調用本機代碼)