我公司有很多用 vb6 编写的旧项目。我们有一些用 ATL/C++ 编写的可重用软件组件。我们现在正在考虑用 UWP 重写我们的应用程序,但似乎 UWP 应用程序不支持旧的 COM 技术。我正在研究是否有办法实现也支持 UWP 的 COM 对象。我知道将我们的旧组件移植到 UWP 组件肯定会奏效。但是我们不想维护两个版本的通用组件,因为我们已经发布了很多旧软件,我们仍然提供软件支持。其中一些软件已被我们的客户使用超过 10 年。不可能升级我们发布的所有软件。
我想出了几个可能的解决方案:
桌面桥
我发现了一个名为“Packaged COM”的短语,UWP 应用程序可以通过桌面桥使用它。这篇文章,桌面桥的 COM 服务器和 OLE 文档支持,提供了一个从 UWP 应用程序调用 exe COM 服务器的示例。如果它也支持 InProcessServer,这似乎是一个很好的解决方案。我确实发现了一些可疑的东西,InProcessServer,但事实证明它是针对 WinRT 组件的。
我还尝试将 COM 引用添加到 UWP 项目。代码可以成功引用 COM 对象。但是,它在运行时不起作用。UWP 应用有自己的注册表配置单元,因此不会加载已注册到系统注册表的 COM 对象。我在想,如果我将注册信息添加到 UWP 应用程序的私有配置单元并将 COM dll 与应用程序一起打包,这可能会起作用。只是找不到任何例子。
ATL/COM
因为我们已经在 COM 对象中实现了我们的业务逻辑。最可行的解决方案是升级我们的 COM 对象以支持 UWP 应用程序。WinRT 组件仍然使用 COM 技术但实现了新的接口IInspectable
,我假设旧的基于 ATL 的 COM 对象如果实现IInspectable
接口可以修改以支持 UWP 的调用约定。我只是没有任何线索来做这件事。
WRL
我找到了一篇 MSDN 文章How to: Create a Classic COM Component Using WRL,讨论了使用 WRL 项目模板来实现可在 Win32 应用程序和 UWP 应用程序中使用的类 COM 对象。
它说:
除了将其用于通用 Windows 平台 (UWP) 应用程序之外,您还可以使用 Windows 运行时 C++ 模板库 (WRL) 创建用于桌面应用程序的基本经典 COM 组件
但我很快意识到微软不再支持 WRL 项目模板。我在网上找到的项目模板的所有下载链接都不再可用。
C++/WinRT
这项技术似乎是 WRL 的继任者。它看起来很有希望,但不幸的是尚未发布。
为了澄清@Peter Torr的几件事:
(1) 您是否希望您的应用程序/COM 对象是“纯”UWP(在所有设备上运行)或者您是否可以使用仅限桌面的 fullTrust UWP(又名桌面桥)?(2) COM 对象是否仅用于发布它们的应用程序,或者它们应该被其他应用程序使用?
我公司使用Windows平台提供基于PC的工业自动化服务(硬件和软件)。所以答案是肯定的,我们对 fullTrust UWP 很满意。我们的产品只能在桌面上运行。我们只想拥抱新技术并利用 UWP 的出色 UI 框架。
COM 对象适用于新应用程序 (UWP) 和旧软件(有些基于 vb6)。我们很高兴将 COM 对象与 UWP 应用程序打包在一起,并将系统注册的 COM 用于旧软件,只要这些 COM 对象是相同的(从相同的代码库构建)。