【问题标题】:AddIn (MAF) : Running in Separate processAddIn (MAF) : 在单独的进程中运行
【发布时间】:2014-01-25 00:46:26
【问题描述】:

我有 WPF 主机应用程序,并且 AddIn 也是 WPF,它返回 UI,如下所述:

[链接]http://msdn.microsoft.com/en-us/library/bb909849%28v=vs.110%29.aspx

我想知道是否可以将 WPF 插件激活为外部进程:看起来 WPF 插件只被认为与 AppDomain 隔离一起使用,这对我们的应用程序来说还不够好。如果 AddIn 因任何原因崩溃,我们不能让主机一直崩溃。即使加载的 AddIn 崩溃,我们也希望我们的主机应用程序能够运行。

我知道我们可以通过以下方式在System.AddIn 中实现这一点:

//Activate the selected AddInToken in a new 
//application domain with the Internet trust level.
Calculator CalcAddIn = selectedToken.Activate<Calculator>(new AddInProcess(), AddInSecurityLevel.fulltrust);

但我有 WPF 插件而不是 System.AddIn,因为我们的插件有 WPF UI 组件。

我可以在新的应用程序域中激活 WPFAddIn,如下所示:

//Activate the selected AddInToken in a new 
//application domain with the Internet trust level.
Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet);

我无法获得任何有关使用 WPF 插件处理这种情况的最新信息。是否有任何可能的示例,如何在单独的进程中激活 WPF 插件或在主机中捕获未处理的异常。基本上我不能让主机在插件崩溃时死掉。 我确实遵循了以下链接,但结果发现线程非常旧,并且没有当前信息。

[链接]http://social.msdn.microsoft.com/Forums/vstudio/en-US/3c8592f2-14a6-418b-ab11-6d18096aaa0c/systemaddin-addinprocess-and-wpf?forum=wpf

如果我可以处理主机中的异常,那也很好。让我解释一下我的问题:

我有 WPF 主机“A”。有 WPF 插件“B”。

我已经在主机“A”中加载了插件“B”。 AddIn“B”有一个点击按钮。当用户单击按钮时,将在 AddIn "B" 中触发事件。在这种情况下,没有可用的尝试捕获,并且从该事件中抛出一些空异常。这个未处理的异常导致我的主机(以及 WPF 应用程序)崩溃。

我正在寻找一种解决方案,我可以在主机“A”中处理此异常,卸载插件“B”并继续主机而不会发生任何崩溃。

我已经使用 AddInSecurityLevel.FullTrustAddInSecurityLevel.Internet 尝试过 AddIn。

任何提示或示例都会有所帮助。

【问题讨论】:

  • 您可以监控使您的应用程序崩溃的加载项,如果它们经常崩溃,请将它们列入黑名单,而不是增加所有这些复杂性 (MAF)。然后允许用户启用不稳定的插件。这是 MS OFFICE (office.microsoft.com/en-us/outlook-help/…) 的做法。
  • 嗨 Panos- 我已经在使用 MAF (WPF AddIn) 管道方法来加载插件。有什么方法可以防止这种 MAF-WPF AddIn 方法崩溃。因为我们不能在单独的进程中运行 WPF 插件。
  • AppDomain 隔离不能保证这一点。在某些情况下可以但不完全。看看stackoverflow.com/a/16438141/850119。在您的情况下,您当然不能进行进程隔离。但其余的都适用。

标签: c# wpf maf system.addin


【解决方案1】:

我认为下面的 msdn 杂志文章清楚地解释了如何设计基于容错插件的应用程序,其中插件托管在单独的进程中。它也有一个样本。在示例中,插件的异常可以轻松处理,而不会影响宿主应用程序或其他插件。

在 WPF 中构建容错复合应用程序 http://msdn.microsoft.com/en-us/magazine/dn519924.aspx

【讨论】:

  • Praggie- 感谢您的回复。我会尝试并报告结果。
  • 我最终为我们的应用程序使用了“在 WPF 中构建容错复合应用程序”。根据我们的需要,它工作得很好。如果插件因任何原因崩溃 -host 应用程序没有崩溃。因为插件在其单独的进程中运行。插件加载/初始化比 MAF/WPF 插件快得多。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多