Как изменить содержимое / заменить двоичный файл MSI в качестве шага после сборки? - PullRequest
2 голосов
/ 15 июля 2010

При создании проекта установки Visual Studio 2010 с CustomAction в системах x64 Visual Studio включает в себя неправильную версию InstallUtilLib.dll: он устанавливает 32-разрядную оболочку, которая не будет работать для пользовательских действий, скомпилированных как 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 Ответ

4 голосов
/ 15 июля 2010

Не уверен, как вы хотите автоматизировать это, с помощью сценария, кода и т. Д. Но в любом случае, все эти функции доступны через Windows Installer SDK , который, я считаю, является частью Windows SDKnow (раньше это был Platform 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

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

...