Как COM обеспечивает взаимодействие языков? - PullRequest
0 голосов
/ 08 февраля 2019

Я понимаю, как COM может достичь кода C ++, не зависящего от компилятора, поскольку он определяет ABI, внимательно следя за тем, какие функции языка C ++ использовать.Это просто код C ++, действительно умно говорящий с кодом C ++.Однако я до сих пор не понимаю, как он может позволить языковое взаимодействие с C # или Javascript, например.

Где граница?Единственное объяснение, которое у меня есть сейчас, заключается в том, что сам языковой компилятор должен иметь специальную поддержку COM, чтобы он мог генерировать надлежащий код сборки, чтобы обеспечить точную связь между вызывающим / вызываемым.

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Конечно, это не волшебство.

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 - это просто спецификация, которая дает дизайнерам такую ​​золотую середину, «место, где все могут встретиться».

0 голосов
/ 08 февраля 2019

Поскольку вы пометили свой вопрос с помощью WinRT, я предполагаю, что вы спрашиваете конкретно о том, как это достигается с помощью языковых прогнозов WinRT.В этом случае все языки должны иметь какой-то способ сопоставить свои конструкции на естественном языке с COM ABI, который определяет WinRT.Этот ABI получен из метаданных, закодированных в стандарте ECMA 335, и применяются специальные правила для преобразования абстрактных метаданных в конкретный ABI.Есть естественно разные способы достичь этого.Сам CLR был обновлен для поддержки WinRT в C #.Компилятор Visual C ++ был (к сожалению) дополнен языковыми расширениями для поддержки WinRT через C ++ / CX.Подход C ++ / WinRT очень отличается тем, что он требует только стандартного компилятора C ++, а все знания о WinRT предоставляются через стандартную библиотеку C ++ только для заголовков.Другие языки могут использовать другие подходы, но в конце концов они должны договориться о том, как типы, выраженные в метаданных, преобразуются в объекты и вызовы виртуальных функций в ABI на основе COM.

И пока этот процессв настоящее время недостаточно хорошо документировано, C ++ / WinRT является одной из единственных проекций языка с открытым исходным кодом и, таким образом, служит полезной справочной реализацией для тех, кому необходимо понять, как WinRT работает под капотом.

https://github.com/Microsoft/xlang/tree/master/src/tool/cpp/cppwinrt

0 голосов
/ 08 февраля 2019

«Библиотека типов» - это то, что обеспечивает взаимодействие компонентов COM между различными языками.

https://docs.microsoft.com/en-us/windows/desktop/midl/com-dcom-and-type-libraries

Библиотека типов (.tlb) - это двоичный файл, который хранитинформация о свойствах и методах объектов COM или DCOM в форме, доступной для других приложений во время выполнения.Используя библиотеку типов, приложение или браузер могут определить, какие интерфейсы поддерживает объект, и вызвать методы интерфейса объекта.Это может произойти, даже если объект и клиентские приложения были написаны на разных языках программирования.Среда выполнения COM / DCOM также может использовать библиотеку типов для обеспечения автоматического межкомпонентного, межпроцессного и межмашинного маршалинга для интерфейсов, описанных в библиотеках типов.

Другой подход дляЯзыковое взаимодействие (например, проектирование объектов C ++ в Javascript) заключается в том, что COM-объект может реализовывать IDispatch .

...