Разверните С# ActiveX в CAB для использования в Internet Explorer

Я отчаянно пытаюсь развернуть ActiveX для IE, разработанный на С#, как архив CAB. Я прочитал много ресурсов (некоторые из них из StackOverflow), и похоже, что у многих людей есть те же проблемы. Я попробовал 3 решения: a) создание проекта CAB VS, b) вручную создание CAB с использованием CABARC с регистрацией COM в INF и c) вручную создание CAB с запуском msiexec. Ни один из них не работал. Я даже попытался d) создать загрузчик, который запускает msiexec безрезультатно (потому что некоторые люди предложили просто запустить msiexec в Vista не может работать).

Я запускаю Windows Vista, но мой проект не запускается даже в IE6 на XP.

Когда я устанавливаю ActiveX с помощью MSI, все отлично работает на всех Windows. Очевидно, что CAB не работает, и я не смог найти подходящий способ отладки всего этого процесса.

Любая помощь приветствуется.

Ответы

Ответ 1

Обновление: обратите внимание, что этот старый, но отличный ответ по-прежнему является очень хорошим наброском для подхода к решению этой проблемы, по крайней мере, по эволюционному масштабу, как Win7 и IE11. Я просто преуспел в том, чтобы все это работало с использованием набора средств для ответа Firebreath.org в качестве точки перехода. Это не просто, но это можно сделать. Я добавил ссылку на этот проект в список ссылок ниже, поскольку он может сделать более логичную точку перехода для существующих разработчиков, чем этот обзор.


Ура - Я только что закончил идентичный проект, поэтому вам будет приятно узнать, что это действительно возможно. Я тестировал это только на XP - я понимаю, что могут возникнуть проблемы, при которых Vista/7 не позволяет вызывать msiexec.

Учитывая, что у вас есть сборка, правильно отображающая COM-интерфейс, я сделал следующее:

  • Сильно названная сборка.
  • Создан INF файл
  • Создан MSI с использованием шаблона Visual Studio 2008 "Настройка проекта".
  • Создал CAB файл, используя "iexpress.exe" в комплекте с Windows XP.

Создать файл INF

Файл *.inf, который я использовал, выглядит так:

[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Setup Hooks]
install=install

[install]
run=msiexec.exe /package """%EXTRACT_DIR%\SampInst.msi""" /qn

Единственный бит, который вам нужно изменить, - это SampInst.msi. Примечание. Я бы использовал имя файла 8.3, так как длинные имена файлов могут вызывать проблемы. Во время тестирования я бы не использовал qn-переключатель, так как это тихая установка.

Создать установщик

Установщик должен сделать только одно, и это зарегистрировать сборку, вызвав RegAsm. Большинство установщиков предоставят некоторый способ, чтобы легко это сделать. Например, установщик, созданный через VS 2008, просто должен иметь свойство "Register" для сборки, установленное на "vsdrpCOM". Обратите внимание, что vsdrpCOM следует выбрать, поскольку он генерирует соответствующие записи реестра во время сборки. Параметр vsdrpCOMSelfRegistration, скорее всего, завершится неудачей, так как он вызовет RegAsm во время выполнения и, таким образом, не будет работать для не-администраторов.

Пакет установщика в файл CAB

Это может быть сделано любым архиватором кабины. Windows XP содержит iexpress.exe, архиватор, управляемый мастером, в то время как Microsoft CAB SDK содержит cabarc.exe. Также доступны другие сторонние инструменты. Обратите внимание, что вам нужно зарезервировать место в CAB файле для подписи кода, если вы собираетесь подписывать CAB.

Вам понадобится CAB INF файл и файл MSI. Вам не потребуется CAB файл Setup.Exe.

Полезная подсказка: Тип проекта проекта Project VS2008 позволяет вам установить шаг после сборки в свойствах, поэтому вы можете создавать и CAB за один шаг. Мой шаг после сборки выглядит следующим образом:

cd "$(ProjectDir)"
"%WINDIR%\System32\Makecab.exe" /f "VboCslib.ddf"

Формат файла DDF документирован.

Пример страницы HTML

Тег объекта используется для указания файла кабины, содержащего установщик. Очень простая HTML-страница, которая будет развертывать ActiveXControl, будет:

<html>
<head></head>
<body>

    <!--
        ID :    The id of the ActiveX control to be used in JavaScript.
        CLASSID : The GUID associated with the ActiveX control.
        CODEBASE: The location containing the CAB installer for the ActiveX 
       control. This could be a URL, or a relative path.
        -->
    <OBJECT ID="MyActiveXControl"
            CLASSID="CLSID:FC36FAE1-48E0-4f6b-B469-E1B5A8C6D1AC"
            CODEBASE="cabfiles\SampleCabFile.CAB#version=1,0,0,0">
        </OBJECT>

        <script>
            MyActiveXControl.SomeMethod();
        </script>
    </body>
    </html>

Полезные советы

  • Убедитесь, что ваш установщик установлен на основе "для каждого пользователя", а не "для каждой машины". Это сделает его более вероятным для установки, если у пользователя нет прав администратора.

Устранение неисправностей

Internet Explorer 6 действительно предоставляет действительно полезную диагностическую помощь. Очистите временные файлы Интернета, а затем перейдите на веб-страницу. Если установка не работает, перейдите в свои временные интернет файлы, и вы увидите пару файлов там. Один из них будет запускать журнал ошибок? CodeDownloadErrorLog. Перетащите его на рабочий стол и откройте его в блокноте, и он даст подробные сведения о том, что он пытался сделать, когда он не удался.

Ссылки

  • Microsoft KB247257 - Шаги для подписания .cab файла
  • MSDN - О файловой архитектуре INF
  • SN.EXE - Сильные коды кода с сильными именами
  • Никольское ремесло - Как развернуть элемент управления .NET ActiveX
  • CodeProject - Создание ActiveX.NET Шаг за шагом
  • CodeProject - Загрузка компонентов CX ActiveX через CAB файл
  • MSDN - Свойство ALLUSERS (Windows)
  • MSDN - Элементы управления ActiveX без полномочий
  • MSDN - Формат Microsoft Cabinet

Обновление: Firebreath.orgимеет набор инструментов для создания плагинов для браузеров для многих платформ. Код IE/ActiveX для решения поставленной здесь проблемы - это просто подмножество. Но с 6 ноября 2014 года мне было легче начать с Firebreath и его инструкций, чем попытаться создать среду моего dev и свернуть все свои собственные решения с нуля.