Как изменить содержимое / заменить двоичный файл MSI в качестве шага после сборки?
При создании проекта установки Visual Studio 2010 с помощью CustomAction в системах x64, Visual Studio включает неверную версию InstallUtilLib.dll
: Он устанавливает 32-битную прокладку, которая не будет работать для CustomActions, скомпилированных как 64-битные (требование в моем случае, так как это зависит от 64-битных собственных dll).
Установка такого .msi
результаты в System.BadImageFormat
исключение.
Согласно этому сообщению (64-разрядные управляемые настраиваемые действия с Visual Studio), решение состоит в том, чтобы открыть .msi
в orca.exe
и замените двоичный файл "InstallUtil".
Я хотел бы автоматизировать это. Есть идеи?
РЕДАКТИРОВАТЬ: основываясь на ответе, предоставленном mohlsen, я добавил следующий скрипт в решение (не сам проект установки, поскольку файлы, добавленные в проект установки, попадают в msi...):
Option Explicit
rem -----------------------------------------------------------
rem Setup_PostBuildEvent_x64.vbs
rem
rem Patch an msi with the 64bit version of InstallUtilLib.dll
rem to allow x64 built managed CustomActions.
rem -----------------------------------------------------------
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyAssign = 3
rem path to the 64bit version of InstallUtilLib.dll
Const INSTALL_UTIL_LIB_PATH = "C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtilLib.dll"
Dim installer : Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
Dim sqlQuery : sqlQuery = "SELECT `Name`, `Data` FROM Binary"
Dim database
Set database = installer.OpenDatabase(Wscript.Arguments(0), msiOpenDatabaseModeTransact)
Dim view : Set view = database.OpenView(sqlQuery)
Dim record : Set record = installer.CreateRecord(2)
record.StringData(1) = "InstallUtil"
view.Execute record
record.SetStream 2, INSTALL_UTIL_LIB_PATH
view.Modify msiViewModifyAssign, record
database.Commit
Set view = Nothing
Set database = Nothing
Затем я отредактировал свойства проектов установки: я установил PostBuildEvent
собственность на:
wscript.exe "$(ProjectDir)\..\Setup_PostBuildEvent_x64.vbs" $(BuiltOuputPath)
Примечание. Если щелкнуть правой кнопкой мыши проект установки в обозревателе решений и выбрать "Свойства", откроется неправильное диалоговое окно ("Страницы свойств"). Вы хотите "Окно свойств" (CTRL+W, P).
1 ответ
Не уверен, как вы хотите автоматизировать это с помощью сценария, кода и т. Д. Но в любом случае все эти функции доступны через SDK установщика Windows, который, как мне кажется, является частью Windows SDK (раньше это был SDK для платформы).,
Несмотря на это, вот VBScript, который я использовал в прошлом, чтобы вручную добавить файл в MSI. Это было какое-то время, но я просто запустил его на MSI для тестирования, и проверил с Orca, и сборка была добавлена в двоичную таблицу. Это должно указать вам в правильном направлении.
Option Explicit
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyAssign = 3
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
Dim sqlQuery : sqlQuery = "SELECT `Name`,`Data` FROM Binary"
Dim database : Set database = installer.OpenDatabase("YourInstallerFile.msi", msiOpenDatabaseModeTransact)
Dim view : Set view = database.OpenView(sqlQuery)
Dim record
Set record = installer.CreateRecord(2)
record.StringData(1) = "InstallUtil"
view.Execute record
record.SetStream 2, "InstallUtilLib.dll"
view.Modify msiViewModifyAssign, record
database.Commit
Set view = Nothing
Set database = Nothing
Надеюсь это поможет!