Разверните C# ActiveX в CAB для использования Internet Explorer
Я отчаянно пытаюсь развернуть ActiveX для IE, разработанный в C#, как CAB-архив. Я прочитал много ресурсов (некоторые из них от Stackru), и многие люди сталкиваются с такими же проблемами. Я пробовал 3 решения: а) создание проекта CAB VS, б) создание CAB вручную с помощью CABARC
с регистрацией COM в INF и c) создание CAB вручную с запуском msiexec
, Никто из них не работал. Я даже пытался г) создание загрузчика, который запускает 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.
Полезный совет: тип проекта проекта установки VS2008 позволяет вам установить шаг после сборки в свойствах, чтобы вы могли создать и CAB за один шаг. Мой шаг после сборки выглядит так:
cd "$(ProjectDir)"
"%WINDIR%\System32\Makecab.exe" /f "VboCslib.ddf"
Формат файла DDF задокументирован.
Пример HTML-страницы
Тег объекта используется для указания на файл cab, содержащий установщик. Очень простая 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 - код сильных программ со строгими именами
- Nikolkos Craft - Как: развернуть элемент управления.NET ActiveX
- CodeProject - Создание ActiveX .NET шаг за шагом
- CodeProject - Загрузка компонентов ActiveX C# через CAB-файл
- MSDN - ALLUSERS Property (Windows)
- MSDN - элементы управления ActiveX без прав администратора
- MSDN - формат Microsoft Cabinet
Обновление: http://www.firebreath.org/ имеет набор инструментов для создания плагинов для браузеров для многих платформ. Код IE/ActiveX для решения поставленной здесь проблемы является лишь подмножеством. Но с 6 ноября 2014 года мне было легче начать с Firebreath и его инструкций, чем пытаться создать свою среду разработки и развернуть все свои собственные решения с нуля.