Конечно, это не волшебство.
COM устанавливает правила взаимодействия языков.Это просто контракт, с некоторыми полезными инструментами.Каждый язык, который хочет поддерживать COM, должен найти способ соблюдать правила самостоятельно.Все они должны предоставить свой собственный совместимый механизм, так или иначе.
В случае C ++ правила, как вы сказали, приходят бесплатно, но учтите, что есть одно предостережение: языковой стандарт не делаетуказать расположение и механизм классов и виртуальных функций.Метод, имитируемый COM, является одной из наиболее распространенных реализаций виртуальных вызовов («VTable»), и COM следует точной компоновке, используемой компилятором Microsoft.Но у вас может быть совершенно корректный компилятор C ++, где классы с виртуальными функциями не будут совместимы с макетом COM.Просто никто этого не делает, по крайней мере, в компиляторах Windows.Таким образом, даже в C ++ компилятор имеет некоторую «встречу посередине».
В C вы должны делать все вручную.Другие языки могут позволить вам сделать то же самое (конечно, ассемблер).
Чтобы помочь скомпилированным языкам обмениваться информацией о конкретных контрактах, COM предоставляет библиотеки типов и механизмы для их чтения.Компилятор или язык, который хочет использовать их в своих интересах, также должен «встретиться посередине» и научиться их обрабатывать (например, директива Microsoft C ++ #import
; меню библиотек VB6).
Ни один язык не будет поддерживать все, что вы можете сделать в COM, потому что есть момент (в более непонятных функциях), когда отдача от инвестиций в поддержку языка не вырастает.Каждый язык должен выбирать свои ограничения.В COM есть много вещей, которые вы можете сделать (прочитайте спецификации IDL), которые VB6 не может сделать.
Поскольку соблюдение правил COM на языке, похожем на сценарий, является непрактичным и невозможным, COM предлагает более высокий уровеньподход (автоматизация), который более поддается динамическим языкам, даже если он более ограничен.Но реализатор языка, который хочет обеспечить клиентскую поддержку автоматизации, должен реализовать понимание интерфейса IDispatch, механизма активации и перевода на соответствующие средства своего языка.И язык сценариев, желающий обеспечить поддержку для создания COM-серверов, должен работать еще усерднее для реализации правильной реализации COM IDispatch и автономного хост-движка от имени пользовательских сценариев.Даже VBScript не мог сделать это в начале, пока Microsoft не добавила поддержку .SCR с Windows Scripting Host.Снова «встреча посередине».
Если язык хочет поддерживать как чистую COM, так и автоматизацию, ему нужно работать вдвое усерднее;поддержка одного не дает вам автоматически поддержки другого.
Для языков .NET, таких как C #, большая часть работы выполняется как для собственного COM, так и для автоматизации внутри среды выполнения .NET, которая обеспечивает реализацию COM Callable Wrappers (CCW) и Runtime Callable Wrappers (RCW).) необходимо взаимодействовать с COM и обрабатывать конфликты между подходом подсчета ссылок COM и подходом GC .NET.Microsoft выполнила всю работу в одном месте, поэтому индивидуальные разработчики языка .NET не должны были это делать.
Так что, да, разработчик языка должен работать дополнительно, чтобы обеспечить особую поддержку языка для COM: следуя бинарной компоновкеправила, реализация слоя перевода при необходимости и / или, возможно, предоставление инструментов для чтения библиотек типов.
Языковое взаимодействие требует, чтобы обе стороны (вызывающая сторона и вызываемая сторона) где-то «встретились посередине».COM - это просто спецификация, которая дает дизайнерам такую золотую середину, «место, где все могут встретиться».