C# 使用加载外部程序集/dll的windows服务正确处理错误
我有一个windows服务,它加载了一堆只是.dll文件的“插件”。它使用反射来实现这一点: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
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()处),不会捕获异常,服务停止。