Стоит ли изучать COM?

Я думаю изучить COM. Но я слышал, что Microsoft запустила.NET в качестве альтернативы COM. Так стоит ли изучать COM? на самом деле я начал изучать COM для драйвера устройства UMDF. Есть ли альтернативный способ работы на UMDF кроме COM?

4 ответа

Решение

UMDF - это платформа для разработки драйверов устройств в пользовательском режиме. Я думаю, что ключевым требованием для драйвера устройства является: быстрая загрузка. Я не хочу откладывать время запуска только потому, что у меня есть шустрый драйвер устройства, который должен загрузить и JIT.NET Framework (предварительно, но тем не менее).

Конечно, вы можете разрабатывать раздутые библиотеки com, но, будучи компетентными, вы можете избежать этого. Вы не можете избежать.NET времени выполнения.

Так что даже если бы UMDF допускал разработку.NET, я бы не хотел, чтобы драйверы устройств были написаны на.NET.

Не пойми меня неправильно. Я люблю.NET. Я просто не думаю, что это хорошо сочетается с драйверами устройств, даже если мы говорим о драйверах пользовательских режимов.

Глядя на COM, я думаю, что это помогает понять, почему он был разработан: обеспечить взаимодействие между компонентами, разработанными в разных средах. Это было еще в 80-х. Сейчас люди жаловались на COM на протяжении многих лет, но на самом деле он очень успешен. Были некоторые ошибки в модели развертывания COM (то есть зависимость от реестра) и другие интересные варианты дизайна, которые заставили разработчиков ломать голову. Тем не менее, ядро ​​COM (т.е. IUnknown) по-прежнему звучит как IMO.

COM стар, утомителен и расстраивает. Я не думаю, что кому-то когда-либо нравилось работать с COM. В общем, я бы рекомендовал не изучать его, если у вас нет действительно веских причин. Если есть библиотека COM, которую вам нужно использовать, я бы вместо этого узнал, как использовать ее через COM-взаимодействие, которое позволяет вам работать с COM из.NET.

Чтобы быть ясным, .NET был очень предназначен для замены COM. И это сработало, это было очень успешно. Но COM везде в Windows, вы не можете встряхнуть палку в типичной программе и не столкнуться с COM где-нибудь. Это начинается с самого первого куска кода в любой программе.NET GUI, [STAThread].

В Windows есть много вещей, которые еще не получили дружественную оболочку.NET. Это не всегда необходимо, CLR имеет отличную поддержку взаимодействия COM. Видно из диалогового окна Добавить ссылку, вкладка COM заполнена вкусностями. Но то, что вы видите в этом списке, - это компоненты, специально разработанные для простоты использования в любой среде выполнения. Они реализуют подмножество COM, называемое "OLE Automation".

Автоматизация - это очень ограниченное подмножество, она работает так хорошо, потому что то, что вы действительно можете сделать, ограничено. Однако есть куски кода, которые не соответствуют этому подмножеству. Вид, для которого вы не можете найти библиотеку типов. Без библиотеки типов вы ввернуты в.NET. Наиболее заметным компонентом с этой проблемой является оболочка. Проводник Виндоус. Написание расширения оболочки в управляемом коде сложно.

Проблема заключается в том, что объявления интерфейса COM изначально были разработаны для того, чтобы хорошо работать на компиляторе, который реализует множественное наследование. С ++ конкретно. Объявление интерфейса.NET плохо отображается на интерфейс COM, если этот интерфейс COM был получен из другого интерфейса COM. CLR генерирует неправильную v-таблицу. Об этом говорится в статье в журнале MSDN, хотя авторское заключение совершенно неверно.

Вы можете написать объявления интерфейса COM на языке.NET и реализовать их. Просто вы не получаете никакой помощи от SDK. И что вам нужно знать COM очень хорошо, чтобы понять их правильно.

UMDF также подходит для этой модели, его интерфейсы получены из IUnknown. Нет библиотеки типов. Никакой управляемой обертки, о которой я знаю. Вы можете написать свой код на C#, но вам придется написать все объявления интерфейса самостоятельно. Реально, только C++ применяется здесь.

Да, вам нужно изучить COM.

COM был полезен, потому что он позволял создавать независимый от языка API, который можно использовать на нескольких языках. Теперь.net используется примерно для цели sampe, хотя он менее доступен. Если вы программируете.net, многие COM API "просто работают", хотя хорошо бы получить некоторое базовое представление о том, как работает COM (например, COM использует пересчет для управления памятью, тогда как.net использует сборку мусора).

Другие вопросы по тегам