Область вызываемой оболочки среды выполнения (RCW) — домен процесса или приложения?

StackOverflow https://stackoverflow.com/questions/159313

Вопрос

Какова область действия вызываемой оболочки среды выполнения (RCW) при ссылке на неуправляемые COM-объекты?Согласно документам:

Средство выполнения создает ровно один RCW для каждого объекта COM, независимо от количества ссылок, существующих на этом объекте.

Если бы мне пришлось «угадывать» — это объяснение должно было бы означать «по одному на процесс», но так ли это на самом деле?Любая дополнительная документация будет очень приветствоваться.

Мое приложение работает в собственном домене приложения (это надстройка Outlook), и я хотел бы знать, что произойдет, если я буду использовать Marshal.ReleaseComObject(x) в цикле, пока его счетчик не достигнет 0 (как рекомендуется).Освободит ли он ссылки из других надстроек (работающих в другом домене приложения в том же процессе Outlook)?

РЕДАКТИРОВАТЬ:Отлично, теперь путаница еще больше.Судя по двум ответам (от Летте и Ильи), у нас есть два разных ответа.Официальный документ MSDN говорит для каждого процесса (для версии.2.0+), но это предложение отсутствует для вер.1.1 документа.

В то же время в статье Мэйсона Бендиксена говорится, что это касается каждого домена приложения.

Поскольку его статья старая (апрель 2007 г.), я отправил ему электронное письмо с просьбой дать разъяснения, но если кто-то еще хочет что-то добавить, пожалуйста, сделайте это.

Спасибо

Это было полезно?

Решение

В управлении у нас есть канонические iunknowns с каноническими iunknowns в RCWS.Когда iunknown входит в систему (через вызов маршала, посредством активации, в качестве параметра возврата из вызова метода и т. Д.), Мы проверяем кэш, чтобы увидеть, существует ли RCW для объекта COM.Если существует картирование, возвращается ссылка на существующий RCW.В противном случае создается новый RCW и добавляется картирование кеша.

от Блог Мейсона

Другие советы

Статья в блоге Мейсона Бендиксена, которую цитирует Илья, верна:RCW ограничен AppDomain, а не процессом.Я могу только догадываться, что Вызываемая оболочка во время выполнения (MSDN 2.0) статья была написана «небрежно».Эта статья не обязательно неверна в общем смысле, поскольку чаще всего она выполняется с использованием только одного AppDomain, но это предложение не является технически точным.

Что касается вашего конкретного вопроса:

«Я хотел бы знать, что произойдет, если я использую маршал. Releasecomobject (x) в цикле, пока его счет не достигнет 0 (в соответствии с рекомендациями).Выпустит ли это ссылки из других добавок (работа в другом домене приложения в том же процессе Outlook)?

Ответ на этот вопрос зависит от того, как вы настроили надстройку.В общем, если вы не примете меры предосторожности, то ответ — да, это повлияет на ссылки в других надстройках, работающих в том же домене приложения.Но поскольку вы заявляете, что работаете из отдельного AppDomain, то нет, это не так.

Eсть Мастер COM-оболочки версии 2.3.1 который можно использовать для изоляции надстройки.Документацию для мастера COM Shim можно найти здесь: Изоляция расширений Microsoft Office с помощью мастера COM Shim версии 2.3.1.

Мастер COM-оболочки использует отражение для создания настраиваемого интерфейсного загрузчика COM, который загружает сборку надстройки в отдельный домен приложения.Это обеспечивает безопасность в двух отношениях:

(1) Благодаря использованию отдельной настраиваемой точки входа COM ваша надстройка правильно идентифицируется Microsoft Office отдельно от всех других надстроек.В противном случае по умолчанию все надстройки используют один и тот же загрузчик mscoree.dll по умолчанию.Проблема с использованием одного и того же загрузчика заключается в том, что в случае сбоя какой-либо надстройки Microsoft Office идентифицирует файл mscoree.dll как источник проблемы и не будет загружать его автоматически в следующий раз.Вы можете снова включить ее вручную, но в следующий раз ваша надстройка не загрузится автоматически из-за проблемы в чужой надстройке!

(2) При загрузке сборки в отдельный домен приложения вызываемые оболочки среды выполнения (RCW) изолируются от других надстроек, загружаемых в тот же процесс.В этом случае, если вы вызовете Marshal.ReleaseComObject(object) или Marshal.FinalReleaseComObject(object), вы не повлияете на чьи-либо надстройки.Что еще более важно, если какая-либо из этих других надстроек выполняет такие вызовы, ваша надстройка будет защищена от повреждения.:-)

Недостаток использования мастера COM Shim Wizard заключается в том, что при работе с отдельным доменом приложения возникают дополнительные накладные расходы на сортировку.Я не думаю, что это должно быть заметно для надстройки Microsoft Outlook.Однако это может быть фактором для некоторых интенсивных процедур, которые имеют много вызовов к объектной модели, например, иногда это может иметь место в надстройке Microsoft Excel.

Вы заявили, что уже используете свою надстройку из отдельного домена приложения.Если это правда, то вы уже изолированы от вызовов Marshal.ReleaseComObject(object) и Marshal.FinalReleaseComObject(object) по отношению к другим доменам приложений.(Кстати, мне любопытно, как вы это делаете...Вы явно создаете свой собственный AppDomain?Шаблон надстройки по умолчанию в Visual Studio делает нет запускается в отдельном AppDomain и загружается с использованием mscoree.dll.)

Если вы создаете свой собственный домен приложения, ваш код изолирован, но его идентификатор может не отличаться от других надстроек, поскольку ваша надстройка по-прежнему будет использовать загрузчик mscoree.dll по умолчанию, если вы не использовали какие-либо другие средства. чтобы решить эту проблему.

Надеюсь, это поможет...

Согласно тем же документам:

Среда выполнения поддерживает один RCW за процесс для каждого объекта.

Я думаю, мы можем с уверенностью предположить, что объект = пример, поэтому, если надстройки/AppDomains не содержат ссылок на один и тот же экземпляр, вызов ReleaseComObject не будет публиковать ссылки на экземпляры, созданные где-то еще.

Редактировать:Формулировка документов может быть неправильной, как сказано в другом месте.Если да, то, поскольку ваша надстройка работает в отдельном AppDomain, вам повезло.Даже если разные надстройки ссылаются на один и тот же экземпляр (например,объект сообщения в Outlook), ReleaseComObject вызов в вашем домене приложения не приведет к потере ссылки на этот экземпляр RCW в других доменах приложений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top