从使用Activator.CreateInstance(type)

时间:2016-12-21 12:04:03

标签: c# plugins exception-handling

我有一个C#应用程序可以使用Activator.CreateInstance(type)加载其他dll,它们实现了一个给定的接口(插件)。

现在我想要捕获从它自己的异常处理程序中的新实例抛出的所有异常(因为我无法确定插件是否正确处理了每个异常)以呈现如下消息:

  

Plugin [PluginName]导致以下错误:[Exception.Message]

我可以订阅AppDomain.CurrentDomain.UnhandledException事件,但这会捕获所有异常,而不仅仅是由某个插件引起的异常,而且我也看不到[该什么]插件导致异常。

是否可以为创建的实例分配异常处理程序?

提前致谢,
弗兰克

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解您的具体情况,但解决方案可能是围绕插件对象创建一个包装类,以确保正确处理所有可能的异常:

 public interface IPluginObject
 {
      void Foo();
      IBlah Bar();
      ...
 }

 public Wrapper<T>: IPluginObject where T: IPluginObject
 {
      private readonly T inner;

      public Wrapper(IPlugin obj) { inner = obj; }

      public void Foo()
      {
           try { inner.Foo() }
           catch ....
           finally ...
      }

      public IBlah Bar()
      {
           try { return inner.Bar(); }
           catch ...
           finally ...
      }
 }

繁琐?是的,但是你可以获得确切知道什么插件很麻烦的好处。