Может ли COM-объект .NET, назначенный STA, иметь несколько потоков? - PullRequest
0 голосов
/ 10 января 2019

За последние несколько дней я прочитал несколько очень хороших статей о COM и совместимости. Но есть два утверждения, которые меня немного смущают.

Документация о взаимодействии с Microsoft гласит:

Экспортированный управляемый сервер с библиотекой типов, зарегистрированной Regasm.exe (инструмент регистрации сборки) имеет реестр ThreadingModel запись установлена ​​на Оба. Это значение указывает, что сервер может быть активируется в однопоточной квартире (STA) или многопоточном квартира (MTA). Объект сервера создается в той же квартире, что и вызывающий, как показано в следующей таблице. enter image description here

В документации Microsoft Threading Я нашел:

Управляемые объекты, которые подвергаются воздействию COM, ведут себя так, как если бы они имели агрегировал маршалер со свободной резьбой. Другими словами, они могут быть звонил из любой СОМ квартиры в свободной форме. Единственный управляемые объекты, которые не демонстрируют это свободное многопоточное поведение те объекты, которые являются производными от ServicedComponent или StandardOleMarshalObject.

...

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

Может быть, я не понимаю, что ведет себя так, как будто они собрали маршалер со свободной резьбой . Но значит ли это, что когда в STA создается объект .NET, он по-прежнему ведет себя как объект с Threading Model 'Free' ?

В моем понимании, грубо говоря, все вышеприведенные цитаты означают следующее: Независимо от типа квартиры вызывающего потока (STA, MTA) объект .NET может создавать несколько потоков, поскольку он управляется CLR, и, следовательно, он не должен следовать правилам модели потока COM.

Или даже проще: в моей управляемой библиотеке .NET я могу создать столько потоков, сколько захочу, даже если вызывающий процесс является однопоточным приложением VB6.

Это как-то правильно?

...