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

如何在UWP应用程序中创建COM对象?(C#),c#,com,interop,interaction,uwp,C#,Com,Interop,Interaction,Uwp,问题:如何在通用Windows平台(UWP)应用程序中创建COM对象 动机:我想从WPF切换到UWP。因为我的工作负载需要调用只能通过COM访问的第三方库(据我所知),所以我需要从UWP调用COM 上下文: C# .NET Visual Studio 2015 视窗10 理想情况下针对所有UWP设备,但如果仅限于台式机/笔记本电脑,则可以 背景 在Visual Studio 2013(“Visual Studio 2015中的经典桌面”项目)中,我使用了C代码 Visual Studio项目

问题:如何在通用Windows平台(UWP)应用程序中创建COM对象

动机:我想从WPF切换到UWP。因为我的工作负载需要调用只能通过COM访问的第三方库(据我所知),所以我需要从UWP调用COM

上下文:

  • C#
  • .NET
  • Visual Studio 2015
  • 视窗10
  • 理想情况下针对所有UWP设备,但如果仅限于台式机/笔记本电脑,则可以
背景

在Visual Studio 2013(“Visual Studio 2015中的经典桌面”项目)中,我使用了C代码

Visual Studio项目需要使用对Microsoft.VisualBasic的引用以及COM对象的类型库

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

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

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

我认为,即使UWP应用程序基本上不能进行COM调用,那么我们至少可以构造一个包装器来调用一个正常的.NET程序(即使是通过网络端口),该程序反过来也可以运行COM调用。因为即使在最坏的情况下也可以解决这个问题,所以我觉得应该(而且很可能是)有一个微软提供的解决方案来制作COM对象。但我想,由于UWP是如此的新,在线文档非常稀少,现在很难找到

更新#1

发现一篇MSDN文章,声称WinRT应用程序(包括UWP应用程序)只能使用COM对象的子集。MSDN建议要么使用受支持的COM API元素,要么从不受支持的COM API迁移到功能替换

在我找到一种方法来调用我的第三方库后,我通过谷歌搜索一个运行时错误来找到这篇文章。错误:

类型为“System.Runtime.InteropServices.COMException”的异常 在mscorlib.ni.dll中发生,但未在用户代码中处理

其他信息:使用创建COM组件的实例 CLSID{[edit:GUID已删除]}使用 由于以下错误,CoCreateInstanceFromApp失败:80040154 类未注册(HRESULT的异常:0x80040154 (REGDB_E_CLASSNOTREG))。请确保您的COM对象位于 允许的CoCreateInstanceFromApp列表


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

你肯定知道UWP应用程序是沙盒应用程序,它们几乎需要许可才能完成所有事情。例如,他们不能访问整个文件系统,只能访问沙盒存储区域。 当您希望在Windows应用商店中发布应用程序时,应用程序认证工具包会检查您的应用程序是否未执行不允许执行的操作

您提供的链接(Windows运行时应用程序的Win32和COM…)描述了允许的Win32/COM调用列表。Microsoft允许您调用这些方法,并且只允许调用它们

使用Visual Basic COM对象似乎遥不可及

这与安全限制有关,但也与可用功能有关:例如,无法在Windows Phone(regsrvr32)上注册COM对象

你可以在WPF应用程序中使用C语言,当然也可以用C++语言。不确定如果您尝试在UWP应用程序中复制/粘贴此类代码会发生什么。您可能可以在Windows桌面上运行该代码,但您肯定无法将应用提交到Windows应用商店,而且它也无法在其他UWP平台上运行。微软


我猜UWP不太适合/适应/兼容“旧”COM对象。。。我不确定从WPF到UWP的迁移会给您带来什么?

UWP或Windows Universal Application听起来不是正确的解决方案。UWP不允许COM,因为它在所有平台上都不可用。我假设您希望将windows应用商店用于当前WPF应用程序的部署机制。Windows 10确实为WPF应用程序提供了microsoft所称的桥梁,您可以在Windows应用商店中将WPF应用程序作为appx包进行部署

希望您能用这个解决方案重写很少的内容

有关如何在APPx文件中部署WPF应用程序的更多信息,请参阅以下视频。

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

假设您打算侧载应用程序,而不是通过应用商店进行部署,则可以通过(适用于Windows 8.1但仍适用于Windows 10的文档)间接调用COM对象和库。此功能专为企业应用程序设计,以提供现代用户界面,同时仍可以访问现有功能

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

如果您的主要目标是通过应用商店进行部署,而不需要转换为通用应用程序,那么请查看即将发布的应用程序,它将允许打包您当前的.Net项目进行应用商店部署,并允许扩展它以使用一些UWP功能。

O
// 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");