Использование объектов ATL/COM в приложениях UWP
В моей компании много старых проектов, написанных на vb6. У нас есть несколько программных компонентов многократного использования, написанных на ATL/C++. Сейчас мы рассматриваем возможность переписать наше приложение с UWP, но кажется, что приложения UWP не поддерживают старую технологию COM. Я исследую, есть ли способ реализовать COM-объект, который также поддерживает UWP. Я понимаю, что портирование наших старых компонентов на UWP Components будет определенно работать. Но мы не хотим поддерживать две версии общих компонентов, потому что мы отправили много старого программного обеспечения, и мы все еще предоставляем поддержку программного обеспечения. Некоторые из этих программ используются нашими клиентами более 10 лет. Невозможно обновить все программное обеспечение, которое мы отправили.
Я придумал несколько возможных решений:
Настольный мост
Я нашел фразу под названием "Packaged COM", которая может использоваться приложениями UWP с Desktop Bridge. В этой статье о поддержке COM-сервера и документа OLE для Desktop Bridge приведен пример вызова exe-COM-сервера из приложения UWP. Это кажется хорошим решением, если оно также поддерживает InProcessServer. Я нашел что-то подозрительное, InProcessServer, но оказалось, что это для компоновок WinRT.
Я также попытался добавить ссылку COM в проект UWP. Код может успешно ссылаться на COM-объект. Тем не менее, он не работает во время выполнения. Приложение UWP имеет собственный куст реестра, поэтому он не загружает COM-объект, который зарегистрирован в системном реестре. Я считаю, что если я добавлю регистрационную информацию в частный куст приложения UWP и упакую COM-dll вместе с приложением, это может сработать. Просто не смог найти ни одного примера.
ATL / COM
Поскольку мы реализовали нашу бизнес-логику в COM-объектах. Наиболее жизнеспособным решением будет обновление нашего COM-объекта для поддержки приложений UWP. Компоненты WinRT по-прежнему используют технологию COM, но реализуют новый интерфейс IInspectable, я предполагаю, что старый COM-объект на основе ATL можно изменить для поддержки соглашения о вызовах UWP, если он реализует интерфейс IInspectable. Я просто понятия не имею, чтобы сделать это.
WRL
Я нашел статью MSDN " Как: создать классический COM-компонент с помощью WRL", рассказывая об использовании шаблона проекта WRL для реализации COM-объектов классов, которые можно использовать в приложении Win32, а также в приложениях UWP.
Это говорит:
Вы можете использовать библиотеку шаблонов Windows Runtime C++ (WRL) для создания основных классических компонентов COM для использования в настольных приложениях, в дополнение к использованию для приложений универсальной платформы Windows (UWP).
Но вскоре я понимаю, что шаблон проекта WRL больше не поддерживается Microsoft. Все ссылки на скачивание шаблона проекта, которые я могу найти в Интернете, больше не доступны.
C++ / WinRT
Эта технология, кажется, является преемницей WRL. Это выглядит многообещающе, но, к сожалению, еще не выпущено.
Чтобы уточнить кое-что из Peter Torr - MSFT:
(1) Хотите ли вы, чтобы ваш app / COM-объект был "чистым" UWP (работает на всех устройствах) или у вас все в порядке с fullTrust UWP (он же Desktop Bridge), который предназначен только для рабочего стола? И (2) являются ли объекты COM только для использования с приложением, которое их отправляет, или они должны использоваться другими приложениями?
Моя компания использует платформу Windows для предоставления услуг промышленной автоматизации на базе ПК (как аппаратного, так и программного обеспечения). Так что ответ - да, мы довольны FullTrust UWP. Наши продукты будут работать только на рабочем столе. Мы просто хотим использовать новую технологию и использовать отличную структуру UWP.
COM-объекты предназначены как для новых приложений (UWP), так и для старого программного обеспечения (некоторые основаны на vb6). Мы довольны упаковкой COM-объектов в приложения UWP и использованием системного COM-регистра для старого программного обеспечения, если эти COM-объекты одинаковы (построены из одной и той же базы кода).