2015-08-17 76 views
10

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

动机:我想从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对象的类型库的引用,但由于它未出现在Visual Studio的引用管理器中,因此无法引用Microsoft.VisualBasic

思考,试图解决方案,投机等

我添加了一个引用“Windows桌面扩展为UWP”希望它可能使正常的.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调用我的第三方库。错误:

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。如果没有,这可能意味着我将不得不使用网络端口或其他东西来制作自己的包装,这似乎是错误的。

回答

12

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

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

如果要通过存储进行部署,那么您将保持受限于Windows运行时环境中允许的API,并且不能使用Brokered Windows运行时组件。

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

+0

对于企业级应用程序而言,您是对的,因此无法使用该应用商店并不重要。感谢链接到Brokered Windows运行时组件 - 这正是我一直在寻找的! – Nat

+2

我已为通用Windows应用程序的代理组件创建了一个模板。在这里查看我的帖子https://xamltips.wordpress.com/2015/11/13/brokered-component-for-uwp-on-windows-10/ – Lance

1

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

您提供的链接(用于Windows运行时应用程序的Win32和COM ...)描述了允许的WIN32/COM调用的列表。微软允许你调用这些方法,只有它们。

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

这是关于安全限制,但也对提供的功能:例如,有没有办法在Windows注册的COM对象电话(regsrvr32)。

您可以在C#中的call any COM object (or Win32 API)在WPF应用程序中,当然在C++中。不知道如果您尝试在UWP应用程序中复制/粘贴这类代码会发生什么情况。您可能可以在Windows桌面上运行代码,但您无法将应用程序提交到Windows应用商店,并且在其他UWP平台上无法运行。微软doesn't give many details about calling COM objects from UWP app

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

0

UWP或Windows通用应用程序听起来不像这里的正确解决方案。 UWP不支持COM,因为它不适用于所有平台。我假设你想为当前的WPF应用程序的部署机制使用Windows存储。 Windows 10确实提供了微软称之为WPF应用程序的桥梁,您可以将WPF应用程序作为Windows应用商店中的appx包部署。

希望你会很少有这种解决方案

有关如何部署在APPX文件WPF应用程序请参阅下面的视频的详细信息重写。 https://channel9.msdn.com/Events/Build/2015/2-692

0

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

相关问题