Квартиры "живут" на стороне сервера или на стороне клиента в аутсорсинговой среде?
Я с трудом пытаюсь понять COM-апартаменты в непроцессной среде.
В принципе я не могу понять, почему клиент должен звонить CoInitializeEx
зарегистрировать свою собственную тему в квартире. Я могу понять объект, используемый потоками сервера и потоками сервера, живущими в STA или MTA. Но я не могу понять, почему клиент должен беспокоиться об этом.
Каждая документация / руководство говорит, что клиент должен позвонить CoInitializeEx
зарегистрироваться в квартире. Значит ли это, что сервер отслеживает потоки клиента? Или что данные о квартире распределяются и по клиентскому процессу?
2 ответа
COM-объекты, находящиеся на сервере вне процесса, на самом деле состоят из двух частей - кода реализации на сервере и кода прокси / заглушки RPC, созданного компилятором, и среды выполнения COM. Вызов удаленного COM-объекта преобразуется в вызов локального прокси-объекта, который затем использует некоторый механизм RPC для маршалинга и передачи вызова в качестве сообщения процессу сервера. Сообщение выбирается заглушкой на сервере, которая затем вызывает реальный объект COM и отправляет результат обратно прокси, который затем демарширует его и возвращает его вызывающему клиентскому коду. С точки зрения как клиента, так и COM-объекта все вызовы являются локальными, даже если они происходят по сети, как в случае с DCOM.
Теперь прокси в клиенте ведет себя как обычный COM-объект и должен находиться в какой-то квартире. COM-объект на сервере также находится в собственной квартире. COM позволяет клиенту и серверу иметь разные модели потоков и обрабатывает правильную синхронизацию (что очень легко, когда два взаимодействующих фрагмента кода находятся в разных процессах).
Я бы посоветовал вам прочитать часть "Руководство по процессам, потокам и апартаментам" руководства по COM на MSDN, чтобы лучше понять, какие из них и как они взаимосвязаны.
Это не сервер для отслеживания потоков, это COM, присоединяющий поток к определенной квартире. И это клиент для собственных потоков, поэтому это выбор клиента для создания STA или MTA.
Как только клиент выберет нужную модель квартиры для потока, COM решит, как именно удовлетворить определенные вызовы. Если класс COM зарегистрирован для работы только в MTA, а клиентская среда - STA, то COM должен позаботиться о создании реального объекта в рабочем потоке MTA и перенаправить его интерфейс в клиентскую STA.
Клиент выбирает режим работы, COM получает все вместе с регистрацией сервера.