如何正确处理windows服务主机上的MAF插件崩溃?

本文关键字:MAF 插件 崩溃 主机 正确处理 windows 服务 | 更新日期: 2023-09-27 18:02:51

我有一个windows服务,使用MAF来加载用户创建的插件。以下是我如何加载每个插件:

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

所有的添加将加载ok没有任何问题。我遇到的问题是,我无法控制插件的质量,有时它们会崩溃,导致整个服务停止。是否有一种方法可以让我正确地捕获任何错误,这样就不会使服务崩溃

如何正确处理windows服务主机上的MAF插件崩溃?

看看这些来自系统博客的文章。有关异常处理和外接程序的信息:

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提供了这样做的方法,但正如您可以想象的那样,它在性能方面是昂贵的。

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

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

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

查看这个答案:为健壮的插件/插件管理良好的架构/库。