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

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

动机:我想从WPF切换到UWP。 由于我的工作量要求只能通过COM访问第三方库(据我所知),我需要从UWP进行COM调用。

语境:

  • C#
  • 。净
  • 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的Reference Manager中。

思考,尝试过的解决方案,猜测等

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

我认为即使UWP应用程序从根本上无法进行COM调用,我们至少可以构造一个调用正常.NET程序的包装器(即使通过网络端口),这反过来又可以运行COM调用。 由于即使在最糟糕的情况下显然也可以解决,我觉得应该(并且可能是)微软提供的解决方案来制作COM对象。 但是我想,因为UWP是如此新颖,在线文档很稀疏,现在很难找到。

更新#1

发现了MSDN文章, Win32和COM for Windows Runtime应用程序和通用Windows平台(UWP)应用程序 ,声称WinRT应用程序(包括UWP应用程序)只能使用COM对象的子集。 MSDN建议使用受支持的COM API元素或从不受支持的COM API迁移到function替换。

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

mscorlib.ni.dll中出现“System.Runtime.InteropServices.COMException”类型的exception,但未在用户代码中处理

附加信息:由于以下错误,使用CoCreateInstanceFromApp创建了具有CLSID {[edit:GUID removed]}的COM组件实例失败:80040154未注册类(HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG))。 请确保您的COM对象位于允许的CoCreateInstanceFromApp列表中。

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

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

假设您打算侧载应用程序而不是通过商店进行部署,则可以通过Brokered Windows运行时组件间接调用COM对象和库,以获取侧载Windowsapp store应用程序 (适用于Windows 8.1但仍适用于Windows 10的文档)。 此function旨在为企业应用程序提供现代UI,同时仍可访问现有function。

如果要通过存储进行部署,那么您将受限于Windows运行时上下文中允许的API,并且无法使用Brokered Windows运行时组件。

如果您的主要目标是通过商店进行部署,而您无需转换为通用应用程序,那么请查看即将推出的Windows Bridge for Classic Windows应用程序(也称为“Project Centennial”) ,这将允许打包当前用于商店部署的.Net项目,并允许扩展它以使用一些UWPfunction。

您当然知道UWP应用程序是沙盒应用程序,他们需要获得几乎所有内容的许可。 例如,他们无法访问整个文件系统,只能访问沙盒存储区域。 当您希望在Windowsapp store中发布应用时,应用认证套件会检查您的应用是否执行了不允许执行的操作。

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

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

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

您可以在WPF应用程序中使用C# 调用任何COM对象(或Win32 API) ,当然也可以使用C ++ 调用 。 不确定如果您尝试在UWP应用程序中复制/粘贴此类代码会发生什么。 您可能能够在Windows桌面上运行代码,但您无法将应用程序提交到Windowsapp store,并且它无法在其他UWP平台上运行。 Microsoft 没有提供有关从UWP应用程序调用COM对象的许多详细信息 。

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

UWP或Windows Universal Application听起来不像是正确的解决方案。 UWP不允许使用COM,因为它并非在所有平台上都可用。 我假设你想使用Windows商店来获得当前WPF应用程序的部署机制。 Windows 10确实提供了微软称之为WPF应用程序桥梁的function,您可以将WPF应用程序部署为Windowsapp store中的appx包。

希望你很难用这个解决方案重写

有关如何在APPx文件中部署WPF应用程序的更多信息,请参阅以下video。 https://channel9.msdn.com/Events/Build/2015/2-692

在另一个站点上,出于安全原因,UWP / WinRT方式似乎是MS在那里运行的唯一方式。 我不知道沙箱是否能够检测到从允许对象调用的旧学校自定义COM对象不允许的操作。 我希望沙盒可以实现这一点。