У меня интересная проблема с компонентом 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