Невозможно просмотреть / ссылаться на файл DLL библиотеки классов.net (который является частью развертывания продукта и зависит от EXE-файла.Net) из настраиваемого действия.
Я создаю новое настраиваемое действие в базовом проекте MSI (installshield 2014). Я должен вызвать публичный метод в управляемой сборке.Net abc.dll
который развертывается как часть развертывания продукта. abc.dll
является частью компонента с именем component1
которая является частью функции feature1
в настройке дизайна.
Когда я пытаюсь сослаться на эту сборку в мастере создания пользовательских действий, я упоминаю Location
как Installed with the product
, Но на Action Parameters
шаг в мастере создания пользовательских действий, когда я пытаюсь просмотреть abc.dll
на пути развертывания, то я не вижу его:
Хотя я могу видеть abc.dll
просматривая его в компонентах, как показано на снимке ниже. abc.dll
присутствует как часть component1
который развертывается в %programfiles%
путь продукта.
С другой стороны, я вижу pqr.exe
файл (который развертывается как часть другого компонента component2
) в мастере создания настраиваемых действий, как показано на снимке ниже:
Кто-нибудь может подсказать мне, почему это может происходить?
2 ответа
Наконец-то я понял проблему. Все сводится к тому, как Installshield рассматривает упаковку сборки.Net и ее зависимости.
Разница между тем, как.Net exe и его зависимости называются Installshield:
Всякий раз, когда вы добавляете основной вывод проекта, например pqr.exe
в моем случае он добавляется в компонент. Когда вы просматриваете свой компонент, вы увидите исходный путь к исполняемому файлу под Link To
столбец в терминах стандартных известных переменных среды installshield, например [InstallDir]\ComponentName\
и т.п.
Теперь, когда installshield должен создать пакет MSI для развертывания сборки.Net, например pqr.exe
в моем случае он также пытается упаковать свои зависимости для развертывания. В моем случае prq.exe
зависел от abc.dll
, Но предостережение заключается в том, что installshield не поддерживает список зависимостей сборки.Net статически внутри своего собственного *.ISM
установочный файл проекта.
Так abc.dll
также был показан в компоненте, но его путь представлял собой полный путь к диску, на котором создавался файл ISM, например D:\mywork\MSIProject\
, Это потому что abc.dll
на самом деле не является частью файла проекта ISM insataller. Фактически, я открыл формат xml файла ISM в текстовом редакторе и попытался найти abc.dll
и его там не было вообще. Так abc.dll
отсутствует как сборка для развертывания в файле определения установщика ISM. Но только при сборке файла ISM он пытается упаковать все зависимости вместе с файлом *.exe.
Все зависимости должны находиться в том же корневом каталоге, где находится файл *.exe, иначе installshield не сможет их упаковать.
Разница между тем, как.Net exe и его зависимости упаковываются с помощью installshield:
Еще одно отличие, которое следует отметить, заключается в том, что если вы удалите pqr.exe
из пути к диску, где создается файл ISM, файл ISM не будет создан, но если вы удалите его abc.dll
(который не является физической частью файла определения ISM, поскольку он является только ссылкой / зависимостью), тогда файл ISM все равно будет успешно создан.
Разница между тем, как.Net exe и его зависимости связаны с помощью специального действия в installshield:
Что касается моей реальной проблемы, вы можете ссылаться только на те сборки в своем настраиваемом действии, которые являются частью компонента прямым способом. Вы не можете ссылаться на сборки, которые логически выглядят только как часть компонентов (поскольку они являются зависимостями), но в действительности они отображаются там только потому, что они являются зависимостями управляемого exe-файла.Net.
Я предполагаю, что InstallShield проверяет, что эти двоичные файлы могут быть вызваны как пользовательские действия. Исполняемый файл может быть запущен как настраиваемое действие, поэтому он появляется. Dll не может быть вызван произвольно, если он не экспортирует точку входа с требуемой подписью. Встроенная поддержка установщика Windows для вызова настраиваемых действий управляемого кода отсутствует, поэтому, возможно, InstallShield предоставляет оболочку C++ для вызова (как и проекты установщика Visual Studio). В противном случае C++ Dlls должен иметь эту подпись:
UINT__stdcall CustomActionEntryPoint (MSIHANDLE hInstall)
Примеры здесь:
https://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup-projects-and-custom-actions/
https://www.codeproject.com/Articles/570751/DevMSI-An-Example-Cplusplus-MSI-Wix-Deferred-Custo
И, как я уже сказал, ваша версия IS может иметь поддержку для вызова управляемого кода Dlls в соответствии с некоторым другим описанием вызова Dlls (в отличие от чего-то вроде "вызова стандартного настраиваемого действия установщика Windows").