Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET PInvoke异常处理_.net_Pinvoke_Exception - Fatal编程技术网

.NET PInvoke异常处理

.NET PInvoke异常处理,.net,pinvoke,exception,.net,Pinvoke,Exception,使用PInvoke时会发生哪些异常,或者所有错误都是由方法返回值处理的,如果需要,由开发人员检查并引发异常?我不确定是否有可以引发的异常的确定列表,但我知道至少会发生以下情况 AccessViolationException StackOverflowException 未找到名为的DLL时发生异常。我一时记不起那一种 OutOfMemoryException 这些异常类型中的大多数都不是PInvoke特有的,并且可以在程序中的任何时候发生。PInvoke调用唯一特定的一个异常是DLL no

使用PInvoke时会发生哪些异常,或者所有错误都是由方法返回值处理的,如果需要,由开发人员检查并引发异常?

我不确定是否有可以引发的异常的确定列表,但我知道至少会发生以下情况

  • AccessViolationException
  • StackOverflowException
  • 未找到名为的DLL时发生异常。我一时记不起那一种
  • OutOfMemoryException

这些异常类型中的大多数都不是PInvoke特有的,并且可以在程序中的任何时候发生。PInvoke调用唯一特定的一个异常是DLL not found异常(我不记得是谁的类型)

使用p/Invoke可以肯定地说,有两种错误需要处理

  • P/Invoke本身引发的异常
  • 正在调用的dll返回的错误/
  • 对于第1组,可能会出现一些例外情况(不是最终列表):

    • EntryPointNotFoundException
    • ExecutionEngineeException
    • MissingMethodException
    • 不支持例外
    对于组2,您需要检查p/Invoked方法/函数调用的返回结果,并采取适当的行动。在这里,Marshal.GetLastWin32Error()非常方便


    这就是为什么最好为您需要使用的任何本机内容创建包装器类。这样,您可以将返回结果转换为异常,并将托管代码和本机代码分开。

    pinvoke还会在移动设备上抛出
    MissingMethodException
    ,当进程内存不足时:

    另外:

    • DllNotFoundException
    • BadImageFormatException
      (DLL格式错误或已损坏)
    • MethodAccessException
      (安全透明方法尝试调用本机代码)

    DLL引发的SEH异常也将转换为SEHException。某些标准异常将转换为标准.NET异常。