Статья в блоге Мейсона Бендиксена, которую Илья цитирует, верна: RCW относится к домену приложений, а не к процессу. Я могу только догадываться, что статья Runtime Callable Wrapper (MSDN 2.0) говорила «случайно». Эта статья не обязательно неверна в общем смысле, потому что ее наиболее типично выполнить с использованием только одного домена приложений, но это предложение не является технически точным.
Что касается вашего конкретного вопроса:
«Я хотел бы знать, что произойдет, если я
используйте Marshal.ReleaseComObject (x) в
цикл, пока его счетчик не достигнет 0 (как
рекомендуемые). Это выпустит
ссылки из других дополнений
(работает в другом домене приложения
в том же процессе Outlook) ?? "
Ответ на этот вопрос зависит от того, как вы настроили надстройку. В общем случае, если вы не примете меры предосторожности, ответ будет положительным, это повлияет на ссылки в других надстройках, работающих внутри одного и того же домена приложения. Но поскольку вы заявляете, что работаете с отдельного домена приложений, то нет, это не так.
Существует COM Shim Wizard версии 2.3.1 , который вы можете использовать для изоляции вашей надстройки. Документацию по мастеру COM Shim можно найти здесь: Изоляция расширений Microsoft Office с помощью мастера COM Shim версии 2.3.1 .
Мастер COM Shim Wizard использует отражение для создания настроенного фронтального загрузчика 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 (объект) и Marshal.FinalReleaseComObject (объект) относительно других доменов приложений. (Кстати, мне интересно, как вы это делаете ... Вы явно создаете свой собственный домен приложений? Шаблон надстройки по умолчанию в Visual Studio не запускается в отдельном домене приложений и загружается с использованием mscoree.dll.)
Если вы создаете свой собственный домен приложений, ваш код изолирован, но его идентификация может не отличаться от других надстроек, поскольку ваша надстройка все еще будет использовать загрузчик по умолчанию mscoree.dll, если вы не использовали другие способы решения этой проблемы.
Надеюсь, это поможет ...