Создание COM-компонента в .NET для переопределения функциональности IE (пользовательский менеджер загрузок) - PullRequest
0 голосов
/ 09 августа 2010

Мне нужно создать собственный менеджер загрузок, который заменит стандартный менеджер загрузок в Internet Explorer. После поиска в Google я узнал, что мне нужно создать COM-компонент, который реализует интерфейс IDownloadManager.

Насколько я понимаю, мне нужно создать dll, сгенерировать для него guid и зарегистрировать его с помощью утилиты regasm.exe, а затем добавить конкретную запись в реестр Windows для IE. У меня есть несколько вопросов:

  1. Я хочу, чтобы моя программа была exe, и я хочу иметь возможность запускать ее вручную и добавлять к ней URL, а также запускать ее в IE после нажатия на загружаемую ссылку.

    Хотя я бы предпочел иметь один исполняемый файл, я думаю, что для этого мне нужно создать dll и exe, и из dll я должен проверить, работает ли exe (по идентификатору окна) и запустить, если он общаться с ним как-то. Это правильный подход?

  2. Я хочу поделиться своей программой с другими пользователями, и я не хочу, чтобы они регистрировали COM вручную. Возможно ли сделать это из кода? Или, возможно, мне следует создать установщик (которого я хотел бы избежать)?

1 Ответ

3 голосов
/ 01 декабря 2010

Я начну с ПРЕДУПРЕЖДЕНИЕ : не создавайте компоненты .Net, которые будут загружаться в IE. Задайте себе вопрос: «Что произойдет, если другое приложение сделает то же самое и использует другую версию CLR?». IE не гарантирует какой-либо порядок загрузки различных COM-компонентов, в которых он нуждается, поэтому нет гарантии, что ваша версия CLR будет загружена в процессе к тому времени, когда IE позвонит вам.

Теперь о вашей проблеме. В вашем сценарии есть несколько проблем:

  • .Net изначально не поддерживает создание COM-компонентов вне процесса. Да, его можно создать, выполнив кучу хаков и ручную регистрацию; однако, это не простая задача и требует глубоких знаний о том, как работает COM;
  • Учитывая вышесказанное, вы действительно можете создать .Net DLL и использовать атрибут ComVisible, чтобы предоставить классы, необходимые для COM. Как вы упомянули, вам нужно зарегистрировать его, используя RegAsm.exe, чтобы IE мог использовать его;
  • , поскольку вы хотите, чтобы основная функциональность вашего менеджера загрузок была в автономном исполняемом файле, вам придется использовать механизм межпроцессного взаимодействия с поддержкой .Net. .Net Remoting, вероятно, является самым простым способом его реализации и в большинстве случаев должен соответствовать вашим требованиям. Альтернатива заключается в реализации функции загрузки в процессе. Тем не менее, помимо соображения, что теперь вы можете легко подключить процесс IE, если вы не будете осторожны прислушиваться к его уведомлению о выходе (которое само по себе требует много работы), есть также целая энчилада с защищенным режимом IE7 +, который серьезно ограничивает возможности вашего внутрипроцессного кода (ограниченный доступ к файлам, доступ к реестру, API Windows и другие ограничения);
  • Есть определенные сложности, возникающие из модели процессов IE8 и IE9. Помимо процесса верхнего кадра, IE8 / 9 создает пул процессов и распределяет между ними вкладки. Я не знаю, какой процесс попытается создать ваш COM-компонент, и будет ли он по одному на вкладку, на процесс или на весь сеанс IE (охватывающий несколько процессов), поэтому вы должны быть готовы к тому, что у вас может быть несколько экземпляры в нескольких процессах, запущенных одновременно. Если это так, вам придется выяснить, как обеспечить, чтобы связь между компонентом COM in-proc и исполняемым файлом не сериализовывалась по одному экземпляру за раз, иначе вы можете повлиять на работу пользователя для просмотра. (Простым сценарием может быть страница с несколькими ссылками на скачивание, и пользователь щелкает правой кнопкой мыши по каждой ссылке и выбирает Open in new tab, таким образом запуская несколько загрузок на нескольких вкладках одновременно);
  • даже если в сеансе IE имеется один экземпляр, экземпляры IE с повышенными правами запускаются в отдельном сеансе от экземпляров IE обычного пользователя по соображениям безопасности. Есть интересное осложнение, что ваш вызов .Net Remoting из COM-компонента in-proc в сеансе IE с повышенными правами приведет к тому, что вторая копия вашего исполняемого файла будет также повышена. Таким образом, ваш менеджер загрузки должен быть готов к тому, что два процесса могут получить доступ к одной и той же очереди загрузки;
  • начиная с IE7, защищенный режим IE (по умолчанию) будет перехватывать любые вызовы, которые приводят к запуску нового процесса, и отображать диалог для пользователя. Единственный способ избежать этого - зарегистрировать тихую политику повышения IE для вашего процесса. Политики повышения прав зарегистрированы в HKEY_LOCAL_MACHINE, что означает, что вам понадобится установщик или хотя бы простой скрипт для пользователей, которые будут запускаться от имени администратора;
  • , даже если вы решите не использовать политику повышения прав и жить с неудачным опытом этого диалога, чтобы зарегистрировать свой менеджер загрузок в IE, вам все равно придется писать в куст реестра HKEY_LOCAL_MACHINE, иначе IE не узнает об этом и не буду его использовать. Другими словами, вам все еще нужен какой-то инсталлятор или скрипт развертывания;
  • IE довольно агрессивно измеряет производительность кода, который выполняется в потоке пользовательского интерфейса, и завершает фоновые потоки при выходе из процесса. Таким образом, независимо от того, какие функции у вас есть в компоненте in-proc, вам придется балансировать между тем, чтобы быть максимально быстрым в потоке пользовательского интерфейса (что означает меньше работы, или вы будете влиять на пользовательский опыт), и выполнять работу в фоновых потоках (что означает быть готовым, что вы можете быть убиты без уведомления в любой момент);

Я думаю, что этот список охватывает основные проблемы, которые вам придется решить. Самая большая проблема, с которой вы столкнетесь, заключается в том, что многие особенности модели процесса IE плохо документированы в MSDN, и практически нет примеров реализации этого сценария в управляемом коде (а из тех, которые существуют, большинство из них старые и не являются обновлен для IE8 / IE9, а некоторые даже не будут работать в IE7).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...