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

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

5 голосов
/ 14 августа 2010

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

Ответы [ 4 ]

11 голосов
/ 14 августа 2010

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

10 голосов
/ 14 августа 2010

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

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

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

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

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

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

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

8 голосов
/ 14 августа 2010

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

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

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

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

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

3 голосов
/ 14 августа 2010

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

...