Как изменить содержимое / заменить двоичный файл 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

Надеюсь это поможет!

Другие вопросы по тегам