Я пишу BHO для IE11. В BHO я представил несколько методов, использующих интерфейс IExtension, которые будут вызываться JavaScript. Код ниже
IWebBrowser2 _webBrowser2;
int IObjectWithSite.SetSite(object site)
{
try
{
_site = site;
if (site != null)
{
var serviceProv = (IServiceProvider)_site;
var guidIWebBrowserApp = Marshal.GenerateGuidForType(typeof(IWebBrowserApp));
var guidIWebBrowser2 = Marshal.GenerateGuidForType(typeof(IWebBrowser2));
IntPtr intPtr;
serviceProv.QueryService(ref guidIWebBrowserApp, ref guidIWebBrowser2, out intPtr);
_webBrowser2 = (IWebBrowser2)Marshal.GetObjectForIUnknown(intPtr);
((DWebBrowserEvents2_Event)_webBrowser2).BeforeScriptExecute += S2_BeforeScriptExecute;
}
else
{
((DWebBrowserEvents2_Event)_webBrowser2).BeforeScriptExecute -= S2_BeforeScriptExecute;
_webBrowser2 = null;
}
return 0;
}
private void S2_BeforeScriptExecute(object pDispWindow)
{
dynamic window = _webBrowser2.Document.parentWindow;
IExpando windowEx = (IExpando)window;
windowEx.AddProperty("myExtension");
window.myExtension = this;
}
В этом все работает нормально, за исключением того, что когда пользователь нажимает кнопку refre sh в IE, _webBrowser2.Document.parentWindow выдает исключение
System.NotSupportedException: Exception from HRESULT: 0x800A01B6
at System.Dynamic.ComRuntimeHelpers.CheckThrowException(Int32 hresult, ExcepInfo& excepInfo, UInt32 argErr, String message)
at CallSite.Target(Closure , CallSite , ComObject )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at CallSite.Target(Closure , CallSite , ComObject )
at CallSite.Target(Closure , CallSite , Object )
at BHO.S2_BeforeScriptExecute(Object pDispWindow)
Также я пробовал экземпляр SHDocVw.WebBrowser вместо IWebBrowser2, но проблема все еще та же.
Так есть ли альтернатива этому или чему-то еще, что работает нормально?