【发布时间】:2015-11-09 14:44:20
【问题描述】:
问题:如何在通用 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 文章 Win32 and COM for Windows Runtime apps and Universal Windows Platform (UWP) apps,声称 WinRT 应用(包括 UWP 应用)只能使用 COM 对象的子集。 MSDN 建议要么使用受支持的 COM API 元素,要么从不受支持的 COM API 迁移到功能替代品。
我可以通过谷歌搜索在找到对我的第三方库进行 COM 调用的方法后引发的运行时错误来找到这篇文章。错误:
“System.Runtime.InteropServices.COMException”类型的异常 发生在 mscorlib.ni.dll 中但未在用户代码中处理
附加信息:使用以下命令创建 COM 组件的实例 CLSID {[edit: GUID removed]} 使用 CoCreateInstanceFromApp 由于以下错误而失败:80040154 类未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。请确保您的 COM 对象位于 允许的 CoCreateInstanceFromApp 列表。
我仍然不确定是否有内置方法可以访问我的第三方库的 COM API。如果没有,这可能意味着我必须使用网络端口或其他东西制作自己的包装器,这似乎是错误的。
【问题讨论】:
标签: c# com interop interaction uwp