2010-09-08 2 views
1

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

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

Каков подход, используемый для решения этой проблемы?

+0

поздний переплет. VBscript не использует ни tlb, ни IDL для работы с com. – Arseny

+0

Это может быть полезно: http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-interop/1669/How-to-create-COM-wrapper-for-IActiveDesktop –

+0

Если у вас установлены инструменты SDK, это должно включать в себя средство просмотра OLE-COM ('Oleview.exe'), которое может открывать typelib (в том числе внедренные в файл \ .dll \) как IDL ... Если у вас нет typelib (каково это« tlbimp ». exe', то вам не повезло, кроме как сделать все с помощью 'IDispatch'. – Richard

ответ

2

Существует два типа интерфейсов 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++. И команда опытных программистов, потому что отладка расширений оболочки довольно болезненна.

+0

это одна просветительская статья, поэтому, если .NET interop требует такой тяжелой работы, просто чтобы работать с базовым интерфейсом, каков альтернативный путь развития? MFC, VB или что? ! –

+0

Это не проблема .NET interop, вы можете использовать эти интерфейсы. С огромным количеством работы. Проблема * real * заключается в том, что они были разработаны для использования с кодом C++. Который, назад 17 лет назад, ожидался. Невозможно исправить эту проблему, тогда они взяли красную таблетку. * Очень * трудно сделать его синим. –

+0

У меня нет проблем с использованием C++ и родной api, но они, как правило, менее продуктивны при разработке реальных приложений, я думал об использовании C++/CLI, чтобы извлечь выгоду из как собственного, так и управляемого кода в целом, и я был готов сублимировать безопасную компиляцию, но другая проблема встала, поскольку C# поддерживает WPF, WCF, .. и C++ \ CLI поддерживает их через interop, так как личное мнение, на что бы пойти? –

Смежные вопросы