传播来自C#dll的错误

时间:2015-02-21 22:55:25

标签: c# dll interop

主要问题很简单。我创建了一个c#dll来充当访问解决方案的插件。将错误信息从dll返回到解决方案的适当的OO设计模式是什么?

我知道我使用SetLastError之类的东西来编写用C编写的dll,但这似乎不是OO模式的最佳解决方案。基本设置是我有一个用VBA编写的类,它调用dll中的方法。这些方法返回true或false,具体取决于它们是否有效。如果方法返回false,我希望能够获得有关失败性质的更多信息。

`

 interface IMyClass
 {
      bool MyMethod();
 }
 class MyClass: IMyClass
 {
      public bool MyMethod()
      {
           if(DoSomething() != null)
           {
                return true;
           }
           else
           {
                return false;
           }
      }
      private someDataType DoSomething()
      {
           try
           {
                Something;
                return someDataType;
           }
           catch(SomeException e)
           {
                //how do I return this information
                return null;
           }
      }
 }               

`

2 个答案:

答案 0 :(得分:0)

你有几个选择,我想你想要第一个:

  • 抓住它,重新抛出一个新异常,并将内部异常设置为捕获的异常,让解决方案处理新异常,可能是内部异常的通知。
  • 根本不抓住异常,让它传播所有内部结构
  • 抓住它,记录它,并进行优雅的恢复。之后分析日志

答案 1 :(得分:0)

如果您需要跨境解决方案,请使用Microsoft建议的解决方案:IErrorInfo interface

在DLL中实现IErrorInfo并将所有导出函数包装到try-catch:

try
{
  Something;
  return someDataType;
}
catch(SomeException e)
{
  SetErrorInfo(0, new MyErrorInfo(e.Message));
  return null;
}

[DllImport("oleaut32.dll")]
extern static int SetErrorInfo(uint dwReserved, IntPtr pErrorInfo);

在应用程序代码中调用GetErrorInfo来获取IErrorInfo指针。 IErrorInfo可能被C#,C ++,VB等消耗。