Вопрос: Как создать COM-объект в приложении Universal Windows Platform (UWP)?
Мотивация: Я хочу переключиться с WPF на UWP. Поскольку моя рабочая нагрузка требует обращения к сторонним библиотекам, доступным только через COM (насколько я знаю), мне нужно сделать COM-вызовы из UWP.
Контекст:
- С#
- .NET
- Visual Studio 2015
- Windows 10
- Идеально ориентировать все устройства UWP, но в любом случае, если они ограничены рабочими столами/ноутбуками.
Фон
В Visual Studio 2013 (проект "Классический рабочий стол" в Visual Studio 2015) я использовал код С#
// 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.
Я хочу использовать этот код С# в приложении Universal Platform (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 и COM для Windows Runtime и приложения для универсальной платформы 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 для моих сторонних библиотек. Если это не так, это может означать, что мне придется сделать свою собственную оболочку, используя сетевые порты или что-то еще, что кажется неправильным.