Существует два типа интерфейсов COM. Тот, с которым вы знакомы, это те, которые ограничивают себя подмножеством спецификации COM, известной как «OLE Automation». Также известный как ActiveX до этого срока стал связан с бедствиями безопасности.
Интерфейсы, совместимые с автоматизацией, просты в использовании практически на любом языке. Обычно они наследуются от IDispatch, что позволяет использовать их на языках сценариев. И ограничьте себя использованием только совместимых с автоматизацией типов для своих аргументов метода. Простой материал, сопоставимый с типами значений .NET, BSTR для строк, SAFEARRAY для массивов, VARIANT для нетипизированных аргументов, очень похож на .NET System.Object.
Еще одна особенность, которую они поддерживают, - это библиотеки типов, эквивалентные метаданным .NET. Используется компилятором, чтобы знать, как вызвать методы интерфейса. В IDE используется библиотека типов для автоматического создания библиотеки interop, поэтому вы можете напрямую создать класс-оболочку и вызвать методы из .NET-кода.
Хорошо, это хорошая новость. Плохая новость заключается в том, что существует множество интерфейсов COM, которые не используют ограничения автоматизации. Они обычно наследуются от IUnknown и используют аргументы функции, которые не хорошо маршалируются. Как структуры. Один очень большой и видимый компонент в Windows, похожий на это, - это оболочка. Проводник Виндоус.
Здесь также вставляется IActiveDesktop, это интерфейс оболочки и наследуется от IUnknown. Он объявлен в файле заголовка ShlObj.h SDK, для него нет даже файла IDL. И, следовательно, нет способа получить библиотеку типов с ее определением. Он использует несовместимые типы аргументов, такие как LPCWSTR (необработанный указатель на строку) вместо BSTR. И указатели структуры, такие как LPCCOMPONENT и LPWALLPAPEROPT. Поддержка межсетевого взаимодействия CLR бессильна, чтобы должным образом ее маршалировать.
Использование интерфейса в C# технически не является невозможным, но вы должны обновить интерфейс. Очень осторожно, ошибочно, очень легко сделать. Тот факт, что исходный код, который уже делает это, очень трудно найти, является подсказкой, насколько это сложно. Это прямо входит в «не невозможное, но то, что здравомыслящий программист хочет сохранить код, подобный этой» категории. Оболочка является областью неуправляемого кода на C++. И команда опытных программистов, потому что отладка расширений оболочки довольно болезненна.
поздний переплет. VBscript не использует ни tlb, ни IDL для работы с com. – Arseny
Это может быть полезно: http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-interop/1669/How-to-create-COM-wrapper-for-IActiveDesktop –
Если у вас установлены инструменты SDK, это должно включать в себя средство просмотра OLE-COM ('Oleview.exe'), которое может открывать typelib (в том числе внедренные в файл \ .dll \) как IDL ... Если у вас нет typelib (каково это« tlbimp ». exe', то вам не повезло, кроме как сделать все с помощью 'IDispatch'. – Richard