Совместимость COM с .NET - PullRequest
       24

Совместимость COM с .NET

1 голос
/ 08 сентября 2010

Если вы хотите использовать тип COM в своем коде C # , процесс идет прямо, не так ли? Вам просто нужно использовать импортер библиотек типов, и это нормально, но что если у вас его нет и вы не можете взглянуть на файл IDL ? У вас просто есть сервер COM DLL.

В качестве примера попробуйте использовать интерфейс IActiveDesktop.

Какой метод используется для решения такого рода проблем?

1 Ответ

2 голосов
/ 08 сентября 2010

Существует два вида интерфейсов COM. Вы знакомы с теми, которые ограничиваются подмножеством спецификации COM, известной как «OLE Automation». Также известный как ActiveX до того, как этот термин стал связан с бедствиями безопасности.

Интерфейсы, совместимые с автоматизацией, просты в использовании практически с любого языка. Обычно они наследуются от IDispatch, что позволяет использовать их из языков сценариев. И ограничьте себя использованием только совместимых с автоматизацией типов для своих аргументов метода. Простые вещи, сравнимые с типами значений .NET, BSTR для строк, SAFEARRAY для массивов, VARIANT для нетипизированных аргументов, очень похожи на .NET System.Object.

Другая функция, которую они хорошо поддерживают, - это библиотеки типов, эквивалент метаданных .NET. Используется компилятором, чтобы знать, как вызывать методы интерфейса. Среда IDE использует библиотеку типов для автоматической генерации библиотеки взаимодействия, что позволяет напрямую создавать класс-оболочку и вызывать методы из кода .NET.

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

Здесь также подходит IActiveDesktop, это интерфейс оболочки и наследуется от IUnknown. Он объявлен в заголовочном файле SDK ShlObj.h, для него даже нет файла IDL. И, следовательно, нет возможности получить библиотеку типов с ее определением. Он использует несовместимые типы аргументов, такие как LPCWSTR (необработанный указатель на строку) вместо BSTR. И структурные указатели, такие как LPCCOMPONENT и LPWALLPAPEROPT. Поддержка взаимодействия CLR бессильна правильно это упорядочить.

Использование интерфейса в C # технически не невозможно, но вы должны переопределить интерфейс. Очень осторожно, ошибиться очень легко. Тот факт, что исходный код, который уже делает это, очень трудно найти, указывает на то, насколько это сложно. Это прямо попадает в категорию «не невозможно, но то, что здравомыслящий программист хочет поддерживать подобный код». Оболочка является областью неуправляемого кода C ++. И команда опытных программистов, потому что отладка расширений оболочки довольно болезненна.

...