我们正在调整我们的客户端相对复杂的应用程序(ActiveX / .net / Delphi / C++ / COM )以使用 SxS 来实现非管理员部署和与我们产品的旧版本隔离。
我们能够通过编写一个描述我们进程使用的所有库的清单文件,而无需注册,几乎可以为我们所有的 in proc 组件实现这个目标,例如我们的 .net ui、Delphi ui 和我们在 proc 中使用的 COM 服务器在任何组件的客户端上(几乎)。
这几乎是部分:目前,我们的应用程序调用(从它的 c++ 部分)一个 out of proc ActiveX 服务器(Delphi ActiveX EXE),它本身又调用另一组 out of proc ActiveX 服务器(第三方插件,任何东西都在这里,Delphi,C++,任何东西只要它不在proc ActiveX EXE中并实现我们的接口)。
正如我们所知,SxS 不支持进程外 ActiveX 服务器。而且我们不能像在我们的主进程中的 proc com 服务器中那样使用这些对象,因为这将需要对我们的应用程序进行重大重写,甚至更糟糕的是,需要中断第三方工具和供应商使用的面向公众的 API,一个 api我们不能允许的中断。
我们偶然发现了这篇文章,该文章描述了如何从在单独进程中运行的 Internet Explorer 窗口中提取 IHTMLDocument2。这让我们想到了这种方法:
我们将创建一个辅助卫星应用程序/进程,它将像进程服务器一样运行 ActiveX。然后我们将使用LresultFromObject和ObjectFromLresult将 ActiveX 对象的引用从卫星应用程序传输到主应用程序进程。卫星应用程序将拥有它自己的清单文件,这将允许它在 SxS 模式下运行。
此 Delphi ActiveX EXE 和第三方 AciveX EXE 插件之间将采用相同的方法进行通信
有一个替代解决方案,目前我们不喜欢上面提出的解决方案,即使用 .net 远程处理和 .net com 代理类通过将 com 请求转换为 .net 来打开两个进程之间的通信通道远程处理,然后在第二个过程中返回 com。
那么问题来了:
- 您如何看待这种方法?
- 您看到问题的更好解决方案了吗?