2015-08-17 110 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對象,從允許的對象中調用一個不允許的操作。我希望這可以用於沙盒。

相關問題