C# 使用加载外部程序集/dll的windows服务正确处理错误

C# 使用加载外部程序集/dll的windows服务正确处理错误,c#,reflection,windows-services,C#,Reflection,Windows Services,我有一个windows服务,它加载了一堆只是.dll文件的“插件”。它使用反射来实现这一点: try { Assembly assembly = Assembly.LoadFile("myPlugin.dll"); Type[] types = assembly.GetTypes(); foreach (Type t in types) { Type[] ifaces = t.GetInterfaces(); foreach (Type f in

我有一个windows服务,它加载了一堆只是.dll文件的“插件”。它使用反射来实现这一点:

try
{
   Assembly assembly = Assembly.LoadFile("myPlugin.dll");
   Type[] types = assembly.GetTypes();
   foreach (Type t in types)
   {
      Type[] ifaces = t.GetInterfaces();

      foreach (Type f in ifaces)
      {
          if (f.Name == "MyPlugin")
          {
              pType = t;
              break;
          }
      }
      if (pType != null)
          break;
   }
}
catch
{
   AddToLog("Failed");
}
obj = Activator.CreateInstance(pType);

object[] Parameters = new object[1];
Parameters[0] = _pluginName;

try
{
    pType.InvokeMember("InitializePlugin",
                      BindingFlags.Default | BindingFlags.InvokeMethod,
                      null,
                      obj,
                      Parameters);

}
catch (Exception ex)
{
    AddToLog(_pluginName + " - InitializePlugin error: " + ex.Message);
}

我遇到的问题是,如果带有外部dll的“InitializePlugin”方法失败,则上面代码中的try/catch不会捕获它,并最终导致整个服务崩溃。有没有更好的方法来处理这样的外部加载程序集中发生的错误?

只需使用catch块,没有例外。并非所有异常都有一个类型

try
{

}
catch(Exception ex)
{

}
catch
{
}
finally
{
}

是的,但所有异常都源自
异常
。因此,一个空catch将捕获与将异常类型指定为
exception
的catch相同的异常。当我添加一个不带参数的额外catch时,Visual Studio会发出警告,指出已经有一个catch块捕获所有异常,因此听起来juharr是正确的。因此,我将原始catch块更改为使用没有争论,它成功了。所以CrazyDart,你是对的,但如果你有一个以上的挡块就不行了。谢谢你们。@CrazyDart你们能详细说明一下不是从
异常中派生出来的异常吗?我不想假装知道很多,但我不知道。几年前,我正在编写一些使用ESRI libs的代码,我们的应用程序因为这些未处理的异常而崩溃。我对它进行了研究,发现有些异常不是由.Net framework处理的,而是由C#处理的,这就是它们被捕获的方式。从那时起,每当我看到这种情况出现时,我都会给出解决方案,我会受到那些更了解情况的人的猛烈抨击。。。他们尝试了一下,当它真正起作用时,他们脸上带着困惑的表情回来了。也许我会花点时间来解开这个谜。永远不要使用LoadFile(),使用LoadFrom()。您无法捕获在插件启动的线程中引发的异常。我尝试使用LoadFrom(),但当异常发生时(在第4行,assembly.GetTypes()处),不会捕获异常,服务停止。