【问题标题】:.NET PInvoke Exception Handling.NET PInvoke 异常处理
【发布时间】:2009-10-12 15:44:06
【问题描述】:

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

【问题讨论】:

    标签: .net pinvoke exception


    【解决方案1】:

    使用 P/Invoke 可以肯定地说您需要处理两种错误。

    1. P/Invoke 自身抛出的异常。
    2. 您正在调用的 dll 返回的错误/

    对于第 1 组,可能会出现一些例外情况(不是最终列表):

    • EntryPointNotFoundException
    • ExecutionEngineException
    • MissingMethodException
    • NotSupportedException

    对于第 2 组,您需要检查 P/Invoked 方法/函数调用的返回结果并采取适当的行动。 Marshal.GetLastWin32Error() 在这里派上用场。

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

    【讨论】:

    • DLL 抛出的SEH 异常也会被转换成SEHException。一些标准异常将被转换为标准 .NET 异常。
    【解决方案2】:

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

    • AccessViolationException
    • 堆栈溢出异常
    • 找不到命名的 DLL 时出现异常。不记得我头顶上的类型
    • OutOfMemoryException

    这些异常类型中的大多数并非特定于 PInvoke,并且可能发生在程序中的任何位置。唯一特定于 PInvoke 调用的是 DLL not found 异常(我不记得是谁的类型)。

    【讨论】:

      【解决方案3】:

      还有:

      • DllNotFoundException
      • BadImageFormatException(DLL 格式错误或损坏)
      • MethodAccessException(尝试通过安全透明方式调用原生代码)

      【讨论】:

        【解决方案4】:

        当进程内存不足时,pinvoke 还会在移动设备上抛出MissingMethodExceptionhttp://www.tomergabel.com/NETCompactFrameworkPInvokeAndMissingMethodException.aspx

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-17
          • 2012-02-11
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          相关资源
          最近更新 更多