2009-10-12 105 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(尝试通过安全透明方法调用本机代码)