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

Вопрос: Как создать COM-объект в приложении универсальной платформы Windows (UWP)?

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

Контекст:

  • C#
  • .СЕТЬ
  • 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 для использования _ 3_ и библиотеку типов COM-объекта.

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

Мысли, проверенные решения, предположения и т. д.

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

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

Обновление №1

Нашел статью MSDN, Win32 и COM для приложений среды выполнения Windows и универсальной Windows Приложения платформы (UWP), в которых утверждается, что приложения WinRT (включая приложения UWP) могут использовать только подмножество COM-объектов. MSDN предлагает либо использовать поддерживаемый элемент COM API, либо перейти с неподдерживаемого COM API на функциональную замену.

Мне удалось найти эту статью, погуглив об ошибке времени выполнения, возникшей после того, как я нашел способ сделать COM-вызов моей сторонней библиотеки. Ошибка:

Исключение типа System.Runtime.InteropServices.COMException произошло в mscorlib.ni.dll, но не было обработано в пользовательском коде.

Дополнительная информация: Создание экземпляра COM-компонента с CLSID {[edit: GUID удален]} с использованием CoCreateInstanceFromApp не удалось из-за следующей ошибки: 80040154 Класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). Убедитесь, что ваш COM-объект находится в разрешенном списке CoCreateInstanceFromApp.

Я все еще не уверен, есть ли встроенный способ доступа к COM API для моих сторонних библиотек. Если нет, это может означать, что мне придется создать свою собственную оболочку, используя сетевые порты или что-то в этом роде, что кажется неправильным.


person Nat    schedule 17.08.2015    source источник


Ответы (4)


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

Предполагая, что вы намереваетесь загружать неопубликованное приложение, а не развертывать его через магазин, вы можете косвенно вызывать свои COM-объекты и библиотеки через Компоненты среды выполнения Windows с посредником для загружаемых неопубликованных приложений из Магазина Windows (документы для Windows 8.1, но все еще действительны для Windows 10). Эта функция предназначена для корпоративных приложений, чтобы обеспечить современный пользовательский интерфейс, сохраняя при этом доступ к существующим функциям.

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

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

person Rob Caplan - MSFT    schedule 17.08.2015
comment
Вы правы в том, что основное внимание уделяется корпоративным приложениям, поэтому невозможность использования Store не критична. Спасибо за ссылку на Brokered Windows Runtime Components - это именно то, что я искал! - person Nat; 18.08.2015
comment
Я создал шаблон для брокерского компонента для универсального приложения Windows. Проверьте мой пост здесь xamltips.wordpress .com / 2015/11/13 / - person Lance; 13.11.2015

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

Предоставляемая вами ссылка (Win32 и COM для приложений среды выполнения Windows ...) описывает список разрешенных вызовов WIN32 / COM. Microsoft позволяет вызывать эти методы и только их.

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

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

Вы можете вызвать любой COM-объект (или Win32 API) на C # в WPF. приложение, и, конечно же, на C ++. Не уверен, что произойдет, если вы попытаетесь скопировать / вставить такой код в приложение UWP. Вы можете запустить код на рабочем столе Windows, но вы точно не сможете отправить свое приложение в Магазин Windows, и оно не будет работать на других платформах UWP. Microsoft не дает подробных сведений о вызове COM-объектов из приложения UWP.

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

person Dazzibao    schedule 17.08.2015

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

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

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

person Stuart Smith    schedule 17.08.2015

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

person user8923303    schedule 11.11.2017