我遇到了一个有趣的问题,该问题涉及编写为在 IE 中用作工具栏的 COM 组件。基本上,如果您在 IE 中同时打开多个选项卡,则 COM 对象的各个实例都会被扭曲。请耐心等待。
假设我通过右键单击几个不同的链接并在新选项卡中打开它们来同时打开五个浏览器选项卡。现在,我的工具栏的一项功能涉及在网页中选择文本,然后单击一个按钮将该文本复制到工具栏中。因此,让我们在选项卡 3 中执行此操作。我们选择文本并单击按钮,但那里什么也没有。但是,如果我们在选项卡 2 中选择文本,然后返回到选项卡 3 并单击按钮,我们将在选项卡 2 中选择文本。所以...选项卡 3 中的工具栏从选项卡 2 获取内容。不好。
我已将此问题追溯到我们的 COM 对象(工具栏)中的静态引用。
[ComVisible(true), Guid("2CC75392-1182-470D-BECC-EFA33E629AB8")]
[CLSCompliant(false)]
public sealed class Toolbar : ADXIEToolbar
{
public static Toolbar Instance;
public Toolbar()
{
Instance = this;
InitializeComponent();
}
...other code...
}
请注意,每个 IE 选项卡仅存在一个工具栏实例。
这个引用没有被正确分配,几乎就像它不是线程安全的(它不是)而是域安全之类的。它有时会引用另一个实例。与其他静态字段甚至线程安全单例相同。我不明白。
另请注意,如果我将对此工具栏的引用(在 InitializeComponent 内)传递给控件,我会遇到同样的问题。
this.publicationDateCb.Toolbar = this;
此引用有时会指向不同的选项卡。
如果我使用完全基于订阅的模型,静态引用绝对为零,工具栏作为裁判,那么事情似乎工作正常。这基本上意味着我将不得不重新设计程序,使类之间没有直接交互——它们触发工具栏订阅的事件,调用其他类中的方法。哎哟。
那么我应该使用那个模型(这可能是理想的但我在这里已经很远了)还是我在这里缺少一个简单的修复?
其他说明:
- 所有 IE 选项卡都在单独的进程中运行。
- BHO/工具栏与 IE 选项卡在同一进程中运行。
- 我正在使用 Internet Explorer 的 Add-In-Express 来处理 IE 集成。
- 该项目是为 .NET 3.5 编写的;加载程序使用 .NET 2.0
最佳答案
如果您想在所有工具栏中共享您选择的文本,您可以查看:http://www.add-in-express.com/creating-addins-blog/2009/06/19/internet-explorer-plugin-settings-synchronize/
关于c# - 对 IE 工具栏中实例的静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993635/