c# - 对 IE 工具栏中实例的静态引用

标签 c# internet-explorer com singleton instance

我遇到了一个有趣的问题,该问题涉及编写为在 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/

相关文章:

c# - 在 asp.net 中为动态 PDF 指定文件名

internet-explorer - 如何使用旧版本的 Internet Explorer 进行调试?

css - 如何在兼容模式下从 IE10 文本框中删除清除按钮( 'X' 按钮)?

vba - 从 Visual Foxpro COM 服务器向 VBA 返回对象时出错

c++ - 在 c++ builder 的 com dll 中使用 BSTR 时感到困惑

c# - ASP.NET MVC 实体、DTO、业务对象、ViewModels?我该如何管理?

c# - 使用嵌套数据创建 Razor 表

c# - 在 form_load 和 button_click 中调用函数有什么区别吗?

javascript - Google 在哪里保存这个用于 Google 可视化的文件?我可以将它放在我的站点本地吗?另外,任何让仪表在 IE 中工作的代码示例?

com - COINIT_SPEED_OVER_MEMORY 有什么作用?