Объем обертки вызовов среды выполнения (RCW) - процесс или домен приложения?

Вы можете использовать класс выравнивания начальной загрузки align-middle, чтобы выровнять его.

Как:

6
задан Kate Gregory 23 June 2010 в 14:02
поделиться

3 ответа

В управляемом мы имеем на кэш домена приложения, отображающий канонический IUnknowns назад на RCWs. Когда IUnknown вводит систему (через вызов маршала, посредством активации, как возвращаемый параметр от вызова метода, и т.д.), мы проверяем кэш, чтобы видеть, существует ли RCW уже для COM-объекта. Если отображение существует, ссылка на существующий RCW возвращается. Иначе новый RCW создается, и отображение кэша добавляется.

из блога масона

3
ответ дан 17 December 2019 в 00:16
поделиться

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

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

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

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

1
ответ дан 17 December 2019 в 00:16
поделиться

Статья блога Mason Bendixen, которую цитирует Ilya, корректна: RCW ограничен по объему к AppDomain, не к процессу. Я могу только предположить, что статья Runtime Callable Wrapper (MSDN 2.0) говорила "небрежно". Та статья является не обязательно неправильной в общем смысле, потому что это является самым типичным для выполнения использования, только единственный AppDomain, но то предложение не технически точен.

Относительно Вашего конкретного вопроса:

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

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

Существует Версия 2.3.1 Мастера Контейнера COM, которую можно использовать для изоляции дополнения. Документация для Мастера Контейнера COM может быть найдена здесь: Изоляция Расширений Microsoft Office с Версией 2.3.1 Мастера Контейнера COM.

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

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

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

Оборотная сторона к использованию Мастера Контейнера COM - то, что путем работы из отдельного AppDomain существует дополнительный маршалинг наверху. Я не полагаю, что это должно быть примечательно для дополнения Microsoft Outlook. Это может быть фактор, однако, для некоторых интенсивных стандартных программ, которые имеют много вызовов к объектной модели, тех, которые могут иногда иметь место для дополнения Microsoft Excel.

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

При создании собственного AppDomain код изолируется, но его правосубъектность не могла бы быть раздельной от других дополнений, однако, поскольку дополнение будет все еще совместно использовать загрузчик mscoree.dll по умолчанию, если Вы не использовали некоторые другие средства обратиться к этому.

Я надеюсь, что это помогает...

3
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: