c# - 如何在 UWP 应用程序中创建 COM 对象? (C#)

标签 c# com interop interaction uwp

问题:如何在通用 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 对象的类型库。

我想在 Visual Studio 2015 Enterprise 在 Windows 10 Education 上生成的通用 Windows 平台 (UWP) 应用程序中使用此 C# 代码。我能够添加对 COM 对象类型库的引用,但无法引用 Microsoft.VisualBasic,因为它没有出现在 Visual Studio 的引用管理器中。

想法、尝试过的解决方案、推测等

我添加了对“UWP 的 Windows 桌面扩展”的引用,希望它可以启用对普通 .NET 功能的调用,但还没有弄清楚如何使用它。

我认为,即使 UWP 应用程序根本无法进行 COM 调用,那么我们至少可以构造一个包装器来调用普通的 .NET 程序(即使通过网络端口),该程序又可以运行 COM称呼。由于即使在最坏的情况下也显然有可能变通,所以我觉得应该有(而且很可能是)Microsoft 提供的创建 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 调用的方法后抛出的运行时错误,找到了这篇文章。错误:

An exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.ni.dll but was not handled in user code

Additional information: Creating an instance of the COM component with CLSID {[edit: GUID removed]} using CoCreateInstanceFromApp failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Please make sure your COM object is in the allowed list of CoCreateInstanceFromApp.

我仍然不确定是否有内置方法可以访问我的第三方库的 COM API。如果没有,这可能意味着我必须使用网络端口或其他东西制作我自己的包装器,这似乎是错误的。

最佳答案

正如您所注意到的,不可能从通用 Windows 应用访问任意 COM 对象。您的第三方库很可能也使用 Windows 运行时中无法直接使用的 API。

假设您打算旁加载应用程序而不是通过应用商店进行部署,您可以通过 Brokered Windows Runtime Components for side-loaded Windows Store apps 间接调用您的 COM 对象和库。 (适用于 Windows 8.1 的文档,但对 Windows 10 仍然有效)。此功能专为企业应用而设计,可提供现代 UI,同时仍可访问现有功能。

如果您想通过商店进行部署,那么您将只能使用 Windows 运行时上下文中允许的 API,并且不能使用代理的 Windows 运行时组件。

如果您的主要目标是通过商店进行部署,并且不需要以其他方式转换为通用应用程序,那么请查看即将推出的 Windows Bridge for Classic Windows apps (also called ”Project Centennial”)这将允许打包您当前的 .Net 项目以进行商店部署,并允许对其进行扩展以使用某些 UWP 功能。

关于c# - 如何在 UWP 应用程序中创建 COM 对象? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32042324/

相关文章:

c# - 将数据发布到 asp.net 网页时出现问题(Desktop C# 端的问题)

c# - 如何实现自己的 HashSet contains 方法

c# - 带后退按钮的文本 block

C# 如何获取 COM 接口(interface)的实例

c++ - 在非托管 C++ 项目中使用 vb.net dll

c# - 从尚未保存的实体获取 ID

c++ - 如何在 C++ 中维护对 COM 对象的弱引用?

c# - 如何使用 C# 控制台应用程序获取回收站中的文件列表

c++ - XPATH 包含(字符串,字符串)不工作

java - 为什么 jboss 从返回结构数组的 Coldfusion webservice 中看到一个空的 List<Object>?