从C#dll传播错误

本文关键字:错误 传播 C#dll | 更新日期: 2024-07-23 08:44:17

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

我知道我过去常常为用C编写的dll使用SetLastError之类的东西,但这似乎不是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;
           }
      }
 }               

`

从C#dll传播错误

如果您需要跨边界解决方案,请使用Microsoft建议的解决方案:IErrorInfo接口。

在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等使用。

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

  • 捕获它,重新引发一个新异常,内部异常设置为捕获的异常,让解决方案处理新异常,可能是内部异常的通知
  • 根本不要捕获异常,让它传播所有内部信息
  • 捕捉它,记录它,并进行优雅的恢复。事后分析日志