代码之家  ›  专栏  ›  技术社区  ›  Nat

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

  •  14
  • Nat  · 技术社区  · 11 年前

    问题: 如何在通用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 on Windows 10 Education开发的通用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元素,或从不受支持的COMAPI迁移到功能性替换。

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

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

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

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

    4 回复  |  直到 11 年前
        1
  •  17
  •   Rob Caplan - MSFT    11 年前

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

    假设您打算侧载应用程序而不是通过存储进行部署,则可以通过 Brokered Windows Runtime Components for side-loaded Windows Store apps (文档适用于Windows 8.1,但仍适用于Windows 10)。此功能专为企业应用程序设计,以提供现代UI,同时仍能访问现有功能。

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

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

        2
  •  1
  •   Dazzibao    11 年前

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

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

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

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

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

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

        3
  •  0
  •   Stuart Smith    11 年前

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

    希望你用这个解决方案重写的东西很少

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

        4
  •  0
  •   user8923303    8 年前

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