我正在使用以下示例创建 IE BHO:http://code.msdn.microsoft.com/CSBrowserHelperObject-c5f3d2f6
我遇到的问题是,对于每个选项卡,BHO 都加载了两次。我在 BHO 构造函数中插入了以下核心:
Trace.WriteLine("BHO.ctor");
Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);
在析构函数中:
Trace.WriteLine("BHO.destructor");
Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);
然后在 Setsite 中:
Trace.WriteLine("Bho.SetSite: " + site);
Trace.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId + " of process: " + Process.GetCurrentProcess().Id);
当我在调试输出中启动 IE 时,我看到:
[3376] BHO.ctor
[3376] Thread: 1 of process: 3376
[3376] Bho.SetSite: System.__ComObject
[3376] Thread: 1 of process: 3376
[3376] BHO.ctor
[3376] Thread: 3 of process: 3376
[3376] Bho.SetSite: System.__ComObject
[3376] Thread: 3 of process: 3376
只有当我关闭它时:
[3376] BHO.destructor
[3376] Thread: 2 of process: 3376
[3376] BHO.destructor
[3376] Thread: 2 of process: 3376
因此,BHO 被加载了两次,并且 BHO 的两个实例同时存在。为什么会发生这种情况?
我在我的 BHO 订阅来自第三方集会的事件时发现了这个问题,并且我遇到了一些奇怪的行为(因为该事件有超过 1 个订阅者)。一开始我以为是第三方库导致的,但现在我从 BHO 中删除了所有额外的代码,所以它基本上什么都不做,但仍然被加载了两次。
此外,如果在 SetSite 中我添加 OnDocumentComplete 处理程序,然后在此处理程序中我使用跟踪将 URL 写入调试控制台,我看到第一个线程 URL 将是我页面的实际 URL(例如 www.google.com),第二个线程它将是“关于:空白”。另外,如果我再打开一个选项卡并在那里做一些事情,然后切换到第一个选项卡,我会看到又创建了一个 BHO 实例(URL:about:blank)
最佳答案
这可能是IE的完整性级别管理。
我正在尝试自己解决这个问题。
我目前正在考虑:
第二个似乎在一秒钟左右后消失了。
关于c# - IE BHO 为每个选项卡加载两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896804/