创建在外部进程中运行的 WPF“控件”
Posted
技术标签:
【中文标题】创建在外部进程中运行的 WPF“控件”【英文标题】:Create a WPF "control" that is run in an external process 【发布时间】:2009-07-13 20:45:40 【问题描述】:我有一个 WPF 应用程序,其中包含许多子控件。
其中一个控件托管一个第三方库,该库在后台运行一些本机代码,这些代码会引发访问冲突并使应用程序崩溃。不幸的是,删除库不是一种选择。
我想做的是启动一个新的 Windows 进程,在其中托管第三方库,并以某种方式与之通信。与 Google Chrome 和 IE8 处理浏览器插件的方式非常相似。
问题是第三方库需要绘制到屏幕上,所以我必须以某种方式在我的 WPF 应用程序的主窗口中拥有相当于 html iframe 的内容。
我不知道如何开始,到目前为止,谷歌很难找到它。非常感谢任何建议。
【问题讨论】:
你在这里做了什么?对此非常好奇。 还没有做任何事情。我们必须记得更新这个问题 【参考方案1】:这是一项艰巨的任务,但幸运的是,最近在这个领域有一些工作要做。
您听说过 .NET 3.5 中的 System.Addin 命名空间吗?在这种情况下它可能会有所帮助。它允许将控件加载到单独的 AppDomain 中,但显示在同一 UI 中。我想您必须做一些工作才能使所有内容都能正常通信(以前从未这样做过),但这是可能的。
看看这个来自插件团队的早期帖子:http://blogs.msdn.com/clraddins/archive/2007/08/06/appdomain-isolated-wpf-add-ins-jesse-kaplan.aspx
似乎他们将示例和帮助代码保存在 codeplex 上:http://clraddins.codeplex.com/
我对此非常感兴趣,所以如果您成功了,请告诉我们这对您有何帮助!
【讨论】:
谢谢。我之前调查过 System.Addins ,它看起来应该可以工作。我将下载 clr-addins 示例并查看一下。希望我能够弄清楚他们正在使用的底层技术并自己使用它——System.Addins 所需的合约内容比我需要或想要的要重得多。 按照我的阅读方式,他们正在做很多事情,或者你在那里。除非您需要大量动态,否则请查看“管道生成器”...希望这可以帮助您入门,也许可以忽略很多合同内容。他们在那里做了一些非常疯狂的魔术。我可能读错了,但看起来他们支持进程外...这将很难实现。【参考方案2】:来晚了。如果你还需要这个,你看过这个项目吗:https://docs.microsoft.com/en-us/archive/blogs/changov/hosting-wpf-ui-cross-thread-and-cross-process
我在我的 LOB 应用程序的多个外部进程中运行多个插件。我的框架源于上面的项目。
【讨论】:
【参考方案3】:可能不是最简单的任务。您是否考虑过在单独的应用程序域中托管您的 3rd 方内容?这样,您还将获得良好的隔离级别,同时为您节省另一个项目的麻烦。它是否必须不断刷新,或者您可以在应用程序中的预定义点刷新?也许一些方案可以让您基本上对第 3 方输出进行屏幕截图并将其显示为原始应用程序中的图像......
【讨论】:
据我了解,一个单独的 AppDomain 仍然存在于同一个 win32 进程中?我需要在单独的 Windows 进程中运行它,因为第 3 方应用程序在本机代码级别崩溃(win32 访问冲突等)。当这些发生时,整个 windows 进程都会关闭,.NET 和所有 一个 AppDomain 应该为您解决问题 - 如果一个 AppDomain 出现故障,其他 AppDomain 都可以。将 AppDomain 视为“.NET 进程”(有点)。 您必须让控件越过边界才能工作,并且控件不会扩展 MarshallByRefObject。所以这行不通。 如果不行,BCL中的System.Addin是怎么做的呢?他们有 WPF 用户控件在进程外运行的演示 澄清一下 - AppDomains 只提供内存隔离,它们不会在执行级别保护应用程序。这意味着如果进程中的任何 AppDomain 遇到未处理的异常,它将使整个进程停止。保护托管应用程序的唯一方法是确保将不安全的代码隔离在单独的进程中。以上是关于创建在外部进程中运行的 WPF“控件”的主要内容,如果未能解决你的问题,请参考以下文章