【发布时间】:2009-10-12 15:44:06
【问题描述】:
在使用 PInvoke 时可能会发生哪些异常,或者所有错误都由方法返回值处理,如果需要,由开发人员检查并引发异常?
【问题讨论】:
在使用 PInvoke 时可能会发生哪些异常,或者所有错误都由方法返回值处理,如果需要,由开发人员检查并引发异常?
【问题讨论】:
使用 P/Invoke 可以肯定地说您需要处理两种错误。
对于第 1 组,可能会出现一些例外情况(不是最终列表):
对于第 2 组,您需要检查 P/Invoked 方法/函数调用的返回结果并采取适当的行动。 Marshal.GetLastWin32Error() 在这里派上用场。
这就是为什么最好为您需要使用的任何本机内容创建包装类。这样您就可以将返回结果转换为异常并将托管代码和本机代码分开。
【讨论】:
我不确定是否有可以抛出的异常的明确列表,但我知道至少会发生以下情况
这些异常类型中的大多数并非特定于 PInvoke,并且可能发生在程序中的任何位置。唯一特定于 PInvoke 调用的是 DLL not found 异常(我不记得是谁的类型)。
【讨论】:
还有:
DllNotFoundExceptionBadImageFormatException(DLL 格式错误或损坏)MethodAccessException(尝试通过安全透明方式调用原生代码)【讨论】:
当进程内存不足时,pinvoke 还会在移动设备上抛出MissingMethodException:http://www.tomergabel.com/NETCompactFrameworkPInvokeAndMissingMethodException.aspx
【讨论】: