如何正确处理 Windows 服务主机中崩溃的 MAF 插件?
我有一个 Windows 服务,它使用 MAF 加载用户创建的插件。以下是我加载每个插件的方式:
public bool ActivatePlugin()
{
try
{
_addin = _token.Activate<IAddIn>(AddInSecurityLevel.Host);
return true;
}
catch(Exception ex)
{
AddToLog("Error activating plugin");
return false;
}
}
所有插件都将正常加载,没有任何问题。我遇到的问题是我无法控制插件的质量,有时它们会崩溃并导致整个服务停止。有没有办法让我正确捕获插件中出现的任何错误,这样它就不会导致服务崩溃。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
有关异常处理和加载项的信息,请参阅 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.
您需要在单独的 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.