【问题标题】:Propagating errors from C# dll从 C# dll 传播错误
【发布时间】:2015-02-21 22:55:25
【问题描述】:

主要问题很简单。我创建了一个 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 interop


【解决方案1】:

如果您需要跨界解决方案,请使用微软推荐的一种: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 等使用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 跨越互操作边界是实现它的方法吗?我想过这个,但对我来说只是觉得“肮脏”。主访问项目有一个完全清除的错误记录和报告系统,所以我希望避免让 dll 创建一个单独的日志文件。我知道在使用 win32 dll 时曾经有一个 SetLastError 函数,该设计模式是否已为托管互操作而退役?
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多