问题: 如何在通用 Windows 平台 (UWP) 应用程序中创建 COM 对象?
动机: 我想从 WPF 切换到 UWP。由于我的工作负载需要调用只能通过 COM 访问的第三方库(据我所知),因此我需要从 UWP 进行 COM 调用。
上下文:
- C#
- .NET
- Visual Studio 2015
- Windows 10
- 最好是针对所有 UWP 设备,但如果仅限于桌面/笔记本电脑也可以接受。
背景
在 Visual Studio 2013(Visual Studio 2015 中的“经典桌面”项目)中,我使用了以下 C# 代码:
// Conceptual:
DotNetInterface comObjectInstance =
(DotNetInterface)Microsoft.VisualBasic.Interaction.CreateObject(
"this string specified the COM object type"
);
// Example: Open Excel via COM:
Excel.Application oApp = (Excel.Application)Interaction.CreateObject("Excel.Application");
Visual Studio项目需要引用 Microsoft.VisualBasic
才能使用Interaction.CreateObject()
和COM对象的类型库。 我想在Windows 10 Education上由Visual Studio 2015 Enterprise生成的通用Windows平台(UWP)应用程序中使用此C#代码。 我可以添加对COM对象类型库的引用,但无法引用Microsoft.VisualBasic
,因为它不出现在Visual Studio的“引用管理器”中。我已经添加了对“UWP的Windows桌面扩展”的引用,希望它能够启用对常规.NET功能的调用,但是还没有弄清楚如何使用它。即使UWP应用程序从根本上不能进行COM调用,我认为我们仍然可以构建一个调用正常.NET程序的包装器(即使通过网络端口),该程序将能够运行COM调用。既然明显可以在最坏的情况下解决问题,我觉得应该有(因此可能有)微软提供的解决方案来制作COM对象。但是我猜因为 UWP 很新,网上文档非常稀少且难以找到。
更新#1
找到了MSDN文章“用于Windows运行时应用程序和通用Windows平台(UWP)应用程序的Win32和COM”,它声称WinRT应用程序(包括UWP应用程序)仅能使用COM对象的子集。 MSDN建议使用受支持的COM API元素,或从不受支持的COM API迁移到功能替代品。
我通过搜索运行时错误找到了这篇文章,该错误在我找到一种方法调用第三方库后引发:
类型为'System.Runtime.InteropServices.COMException'的异常在mscorlib.ni.dll中发生,但未在用户代码中处理
其他信息:使用CoCreateInstanceFromApp创建具有CLSID {[edit:已删除GUID]}的COM组件实例失败,由于以下错误:80040154类未注册(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))。 请确保您的COM对象处于CoCreateInstanceFromApp的允许列表中。
我仍然不确定是否有内置的方法可以访问我的第三方库的COM API。 如果没有,这可能意味着我将不得不使用网络端口之类的东西制作自己的包装器,这似乎是错误的。