Я использую WPF WebBrowser (System.Windows.Controls.WebBrowser) и получаю ссылку на интерфейс IWebBrowser2 с помощью IServiceProvider.
Guid serviceGuid = SID_SWebBrowserApp;
Guid iid = typeof(SHDocVw.IWebBrowser2).GUID;
IWebBrowser2 = (SHDocVw.IWebBrowser2)serviceProvider.QueryService(ref serviceGuid, ref iid);
IServiceProvider определяется следующим образом:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
internal interface IServiceProvider
{
[return: MarshalAs(UnmanagedType.IUnknown)]
object QueryService(ref Guid guidService, ref Guid riid);
}
Я встроил WebBrowser в своего рода "IE Light". Это представление, которое содержит стандартную панель веб-навигации («Назад», «Вперед», «Стоп / Перезагрузка» и «URL») и элемент управления WebBrowser.
Периодически моя программа может показывать и скрывать этот элемент управления в рамках проекта MVVM Light.
MVVM Light использует действие «Очистка». Насколько я понимаю, это очень похоже на утилизацию, но предназначено для запуска, когда контроль не нужен немедленно. Управление может быть восстановлено позже, поэтому очистка может быть вызвана несколько раз. Я воспринимаю это как вызов Dispose, то есть я не хочу, чтобы какие-то неиспользуемые ресурсы (управляемые или неуправляемые) занимали память.
Я ожидаю несколько экземпляров окна за время жизни приложения. Поэтому я не хочу, чтобы несколько звонков в Cleanup оставляли висящие ссылки COM.
Я не хочу, чтобы ссылка на COM висела, если я случайно добавил ее, запросив интерфейс. Должен ли я позвонить Marshal.ReleaseCOMObject
, когда я закончу? Или я чрезмерно параноидален в том смысле, что мне нужно очистить ссылку, полученную из IServiceProvider
?