Статическая ссылка на экземпляр в IE Toolbar - PullRequest
3 голосов
/ 13 мая 2011

У меня интересная проблема с компонентом COM, написанным для функции панели инструментов в IE.В основном, если вы открываете сразу несколько вкладок в 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.
  • Я использую надстройкуExpress для Internet Explorer для поддержки интеграции с IE.
  • Проект написан для .NET 3.5;загрузчик использует .NET 2.0

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

Проблема решена, но статические ссылки исчезли.Я сделал несколько вещей:

Во-первых, я изменил целевую версию .NET на 4.0.Очевидно, что BHO, написанные в 4.0, работают лучше - я не могу найти ссылку, чтобы обосновать это утверждение, но я где-то читал.

Что более важно, я вообще покончил со статическими ссылками в сборке.Я избавился от синглетонов и вместо этого создал свойство для каждого бывшего синглтон-класса в своем классе панели инструментов, которое всегда будет уникальным.Затем я передавал ссылку на панель инструментов всякий раз, когда класс должен был ссылаться на бывший синглтон.

Итак ... конструкторы теперь выглядят так:

internal class RegistryData
{
     public RegistryData(Toolbar toolbar)
     {
          ToolbarRef = toolbar;
     }

     ...
}

И, скажем, RegistryData необходимо вызватьСообщения.

private void RegistryUpdated(int keyId)
{
    ToolbarRef.Messaging.SendMessage(keyId);
}

Огромная боль, верно?Часы работы.Но проблема решена.Я не был бы шокирован, если бы эта проблема была связана исключительно с надстройкой-экспрессом.

0 голосов
/ 16 мая 2011

Если вы хотите поделиться выбранным текстом на всех ваших панелях инструментов, вы можете посмотреть: http://www.add -in-express.com / creation-addins-blog / 2009/06/19 / internet-explorer-plugin -Settings-синхронизирует /

...