1

我有一个使用 MAF 加载用户创建的插件的 Windows 服务。这是我加载每个插件的方式:

public bool ActivatePlugin()
{
    try
    {
        _addin = _token.Activate<IAddIn>(AddInSecurityLevel.Host);
        return true;
    }
    catch(Exception ex)
    {
        AddToLog("Error activating plugin");
        return false;
    }
}

所有插件都可以正常加载,没有任何问题。我遇到的问题是我无法控制插件的质量,有时它们会崩溃并导致整个服务停止。有没有办法让我正确捕获插件中出现的任何错误,这样它就不会导致服务崩溃。

4

2 回答 2

3

查看 System.AddIn 团队博客中的这些文章,了解有关异常处理和加载项的信息:

http://blogs.msdn.com/b/clraddins/archive/2007/05/01/using-appdomain-isolation-to-detect-add-in-failures-jesse-kaplan.aspx

http://blogs.msdn.com/b/clraddins/archive/2007/05/03/more-on-logging-unhandledexeptions-from-managed-add-ins-jesse-kaplan.aspx

基本上唯一安全的方法是在单独的进程中激活加载项。这很容易,因为 MAF 提供了这样做的方法,但正如您可以想象的那样,它在性能方面很昂贵。

请注意,在不同的应用程序域中激活加载项并不能保证加载项不会使主机崩溃。如果加载项创建的线程引发未处理的异常,主机将崩溃。

我知道这个问题有点老了,但其他人可能会发现这些信息很有用。

于 2012-04-03T10:09:12.493 回答
0

您需要将插件加载到单独的 AppDomain 甚至单独的进程中。您可能还想用它AppDomain.UnhandledException来提醒您失败的插件 - 它仍然会失败,但您会在退出时收到警报。

看看这个答案:Good Architecture/Library For Robust Plugin/Addon Management

于 2012-01-03T21:24:11.290 回答