問題:如何在通用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。如果沒有,這可能意味着我將不得不使用網絡端口或其他東西來製作自己的包裝,這似乎是錯誤的。
對於企業級應用程序而言,您是對的,因此無法使用該應用商店並不重要。感謝鏈接到Brokered Windows運行時組件 - 這正是我一直在尋找的! – Nat
我已爲通用Windows應用程序的代理組件創建了一個模板。在這裏查看我的帖子https://xamltips.wordpress.com/2015/11/13/brokered-component-for-uwp-on-windows-10/ – Lance