是否可以在.NET中导入本机方法(使用P / Invoke),以便interop自动抛出Win32Exception?

时间:2011-04-11 15:46:34

标签: .net interop

许多Win32方法使用SetLastError来指示错误。在.NET中我会使用这样的方法:

if (!SomeNativeBoolMethod(...))
{
  throw new Win32Exception();
}

OR

var res = SomeNativeIntMethod(...);
if (res != 0)
{
  throw new Win32Exception(res);
}

我想知道.NET互操作基础设施能否为我做这件事。在这种情况下,我会将SomeNativeBoolMethod和SomeNativeIntMethod导入为void方法。 (对于SomeNativeIntMethod,这应该是可选的,这取决于我是否希望能够看到正回报代码。)

有可能吗?

感谢。

2 个答案:

答案 0 :(得分:0)

听起来您正在寻找类似于COM互操作功能的功能,从而将HRESULT签名转换为异常抛出方法。如果是这样,我很遗憾地说这个功能不存在。

很可能是由于Win32 API报告失败的方式有很多种。根本没有普遍的惯例。与COM不同的是,对于返回HRESULT的任何东西,肯定有一个通用的约定。

最好的办法是引入一个辅助函数,它包装PInvoke调用并检查错误代码并适当地抛出。

答案 1 :(得分:0)

您是否考虑过面向方面编程?也许您可以通过使用属性来拦截调用,然后使用通用样板代码来抛出异常。

使用.NET基础结构会有点麻烦,因为您必须:

  1. 创建MarshalByRef或ContextBoundObject派生类
  2. 创建将执行拦截的实例方法
  3. 转发对Win32导入方法的调用
  4. 有一些AOP框架(Microsoft Policy Injection Application Block,Windsor AOP,...)可以帮助您解决此问题。

    另一个选项(我先尝试)是使用 PostSharp ,它可以拦截对静态方法的调用(运行时代理的运行时性能要好得多)。您可以实现自定义属性,并拦截Win32调用,检查GetLastError()并在需要时抛出异常。