2015-08-17 3 views
10

Вопрос: Как создать COM-объект в приложении Universal Windows Platform (UWP)?Как создать COM-объект в приложении UWP? (C#)

Мотивация: Я хочу перейти с WPF на UWP. Поскольку моя рабочая нагрузка требует обращения к сторонним библиотекам, доступным только через COM (насколько я знаю), мне нужно сделать COM-вызовы из UWP.

Контекст:

  • C#
  • .NET
  • Visual Studio 2015
  • для Windows 10
  • идеально нацеливание все UWP устройства, но хорошо, если ограничены настольные компьютеры/ноутбуки.

фон

В Visual Studio 2013 ("Classic Desktop" проект в 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.

Я хочу использовать этот код C# в приложении универсальной платформы Windows (UWP), созданное Visual Studio 2015 Enterprise для Windows 10 Education. Я могу добавить ссылку на библиотеку типов COM-объекта, но не смог ссылаться на Microsoft.VisualBasic, поскольку он не отображается в диспетчере ссылок Visual Studio.

Мысли, пытались решения, спекуляции и т.д.

Я добавил ссылку на «Рабочем столе Windows Расширения для UWP» в надежде, что он может позволить звонки на обычные .NET функции, но еще не выяснили, как его использовать.

Я полагаю, что даже если приложения UWP принципиально не могут выполнять COM-вызовы, мы могли бы хотя бы построить оболочку, которая вызывает обычную .NET-программу (даже если через сетевые порты), которая, в свою очередь, сможет запускать COM-вызов. Так как очевидно, что можно обойтись даже в худшем случае, я чувствую, что должно быть (и, вероятно, это) решение Microsoft для создания 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

Как вы заметили, невозможно получить доступ к произвольным объектам COM из универсального приложения Windows. Вероятно, ваши сторонние библиотеки также используют API, которые недоступны непосредственно из Windows Runtime.

Предполагая, что вы намерены отклонять приложение, а не развертывать через хранилище, вы можете называть свои COM-объекты и библиотеки косвенно через Brokered Windows Runtime Components for side-loaded Windows Store apps (документы для Windows 8.1, но все еще действительные для Windows 10). Эта функция предназначена для корпоративных приложений для обеспечения современного пользовательского интерфейса, все еще имеющего доступ к существующим функциям.

Если вы хотите развернуть через хранилище, вы останетесь ограниченным API, разрешенным в контексте Windows Runtime, и не сможете использовать компонент Runtime для Brokered Windows.

Если ваша основная цель - развернуть через магазин, и вам не нужно иначе конвертировать в универсальное приложение, то посмотрите на предстоящий Windows Bridge for Classic Windows apps (also called ”Project Centennial”), который позволит упаковать ваш текущий.Net для развертывания хранилища и позволит расширить его для использования некоторых возможностей UWP.

+0

Вы правы в том, что основное внимание уделяется корпоративным приложениям, поэтому невозможность использования Хранилища не имеет решающего значения. Спасибо за ссылку на Brokered Windows Runtime Components - это именно то, что я искал! – Nat

+2

Я создал шаблон для брокерского компонента для приложения Universal windows. Проверьте мой пост здесь https://xamltips.wordpress.com/2015/11/13/brokered-component-for-uwp-on-windows-10/ – Lance

1

Вы, конечно же, знаете, что приложения UWP представляют собой приложения с песочницей, им нужно разрешение практически на все. Например, они не могут получить доступ ко всей файловой системе, а только к изолированной области хранения. Когда вы хотите, чтобы приложение было опубликовано в Windows Store, набор сертификатов приложений проверяет, что ваше приложение не делает то, что ему не разрешено делать.

Ссылка, которую вы предоставляете (Win32 и COM для Windows Runtime apps ...), описывает список разрешенных вызовов WIN32/COM. Microsoft позволяет вам вызывать эти методы и только их.

Использование Visual Basic COM-объект, кажется, вне досягаемости ...

Это касается ограничений безопасности, но и о доступных функциях: например, нет никакого способа, чтобы зарегистрировать COM-объект на Windows, Телефон (regsrvr32).

Вы можете call any COM object (or Win32 API) в C# в приложении WPF и, конечно же, на C++. Не уверен, что произойдет, если вы попытаетесь скопировать/вставить этот тип кода в приложение UWP. Возможно, вы сможете запустить код на Windows Desktop, но вы, конечно же, не сможете отправить свое приложение в Windows Store, и он не будет работать на других платформах UWP. Microsoft doesn't give many details about calling COM objects from UWP app.

Я думаю, что UWP не очень хорошо подходит/адаптирован/совместим со «старыми» COM-объектами ... Я не уверен, что эта миграция из WPF в UWP принесет вам?

0

UWP или Windows Universal Application не похоже на правильное решение здесь. UWP не разрешает COM, потому что он недоступен на всех платформах. Я предполагаю, что вы хотели бы использовать хранилище Windows для механизма развертывания вашего текущего приложения WPF. Windows 10 предлагает то, что microsoft вызывает мост для приложений WPF, где вы можете развернуть свое приложение WPF в виде пакета appx в хранилище Windows.

Надеюсь, у вас будет очень мало, чтобы переписать с этим решением

Для получения дополнительной информации о том, как развертывание приложения WPF в файле APPx увидеть следующее видео. https://channel9.msdn.com/Events/Build/2015/2-692

0

На другом сайте способ UWP/WinRT кажется единственным способом, по которому MS продолжает работать по соображениям безопасности. Я не знаю, сможет ли песочница обнаружить на старом школьном пользовательском COM-объекте, вызванном из разрешенного объекта, недопустимое действие. Надеюсь, это возможно для Песочницы.