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

发布于 2024-11-25 23:02:42 字数 428 浏览 0 评论 0 原文

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

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

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

I have a windows service that uses MAF to load user created plugins. Here is how I am loading each addin:

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

All the addins will load ok without any issues. The problem I am having is that I don't have control over the quality of the addins and sometimes they crash and cause the whole service to stop. Is there a way for me to properly catch any errors that come out of the addins so it won't crash the service.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

何其悲哀 2024-12-02 23:02:43

有关异常处理和加载项的信息,请参阅 System.AddIn 团队博客中的这些文章:

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

<一href="http://blogs.msdn.com/b/clraddins/archive/2007/05/03/more-on-logging-unhandledexeptions-from-management-add-ins-jesse-kaplan.aspx" rel="nofollow">http://blogs.msdn.com/b/clraddins/archive/2007/05/03/more-on-logging-unhandledexeptions-from-management-add-ins-jesse-kaplan.aspx< /a>

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

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

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

Look at these articles from the blog of the System.AddIn team for information on exception handling and add-ins:

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

Basically the only way to be safe is to activate the add-in in a separate process. This is easy because MAF provides a way to do so but as you can imagine it is expensive in terms of performance.

Note that activating an add-in in a different application domain does not guarantee that an add-in will not crash the host. The host will crash in case of unhandled exception raised by a thread created by the add-in.

I know this question is a bit old but somebody else could find this information useful.

落墨 2024-12-02 23:02:43

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

看看这个答案:用于强大插件/插件管理的良好架构/库< /a>.

You'll want to load your addins in separate AppDomains or even separate processes. You may also want to use AppDomain.UnhandledException to alert you to a failed addin - it will still fail but you'll be alerted on the way out.

Check out this answer: Good Architecture/Library For Robust Plugin/Addon Management.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文