许多Win32方法使用SetLastError来指示错误。在.NET中我会使用这样的方法:
if (!SomeNativeBoolMethod(...))
{
throw new Win32Exception();
}
OR
var res = SomeNativeIntMethod(...);
if (res != 0)
{
throw new Win32Exception(res);
}
我想知道.NET互操作基础设施能否为我做这件事。在这种情况下,我会将SomeNativeBoolMethod和SomeNativeIntMethod导入为void方法。 (对于SomeNativeIntMethod,这应该是可选的,这取决于我是否希望能够看到正回报代码。)
有可能吗?
感谢。
答案 0 :(得分:0)
听起来您正在寻找类似于COM互操作功能的功能,从而将HRESULT签名转换为异常抛出方法。如果是这样,我很遗憾地说这个功能不存在。
很可能是由于Win32 API报告失败的方式有很多种。根本没有普遍的惯例。与COM不同的是,对于返回HRESULT的任何东西,肯定有一个通用的约定。
最好的办法是引入一个辅助函数,它包装PInvoke调用并检查错误代码并适当地抛出。
答案 1 :(得分:0)
您是否考虑过面向方面编程?也许您可以通过使用属性来拦截调用,然后使用通用样板代码来抛出异常。
使用.NET基础结构会有点麻烦,因为您必须:
有一些AOP框架(Microsoft Policy Injection Application Block,Windsor AOP,...)可以帮助您解决此问题。
另一个选项(我先尝试)是使用 PostSharp ,它可以拦截对静态方法的调用(运行时代理的运行时性能要好得多)。您可以实现自定义属性,并拦截Win32调用,检查GetLastError()并在需要时抛出异常。