Как изменить содержимое файла, включенного в *.msi, с помощью VBScript

Учитывая установщик, созданный с помощью проекта установки VS2010, я хотел бы заменить .NET DLL на другой без изменения имени.

Я уже изменяю файл msi в соответствии с этот вопрос, заменив содержимое записи в "двоичной" таблице.

Я нашел файл, о котором идет речь, с помощью Orca. Он находится в единственном CAB-файле. Я нашел этот CAB-файл в таблице «Медиа». Я не знаю, как изменить этот CAB-файл (API), и подозреваю, что мне также придется изменить некоторую информацию в базе данных MSI (запись «ProcessorArchitecture» для сборки в таблице «MsiAssemblyName»).

Обоснование: я делаю установщик для подключаемого модуля Autodesk Revit 2011. Они регистрируются с помощью сборки RevitAddinUtility.dll, которая должна быть связана с установщиком. Эта сборка поставляется в двух вариантах: один для 32-разрядных и один для 64-разрядных установок. Мне нужно поменять правильную версию при создании установщика, чтобы не писать более одного установщика.


person Daren Thomas    schedule 24.08.2010    source источник


Ответы (2)


Ознакомьтесь с этой статьей, чтобы узнать о более простых способах достижения цели:

RevitAddInUtility для 32 и 64-битные системы

person Christopher Painter    schedule 24.08.2010
comment
о да. Я прочитал это, и мозг пукнул от последствий. Спасибо! - person Daren Thomas; 24.08.2010
comment
(Но на сам вопрос еще нет ответа - я хотел бы увидеть ответ на общий случай замены файла в msi!) - person Daren Thomas; 24.08.2010
comment
Нет такого универсального случая. Вы обновляете исходный код установщика и перестраиваете MSI. Вы когда-нибудь заходили в построенную сборку и обновляли класс с помощью ассемблера IL? MSI предназначены для преобразования, но это выходит за рамки того, что должно делать преобразование. - person Christopher Painter; 24.08.2010

Вот обходной путь, который я использую в настоящее время:

  • добавьте оба файла, один с именем RevitAddinUtility.dll другой RevitAddinUtility64.dll
  • в PostBuild-Event спросите пользователя, должен ли проект установки быть 64-битным.
  • если да, то измените имена файлов:

    If 6 = MsgBox("Build for 64bit?", 4, "Setup PostBuild event for DesignPerformanceViewer") Then
        Dim installer : Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
        Dim database : Set database = installer.OpenDatabase(PATH_TO_MSI, msiOpenDatabaseModeTransact)
        Dim sqlQuery : sqlQuery = "SELECT `FileName`, `Component_` FROM File"
        Dim view : Set view = database.OpenView(sqlQuery)
        view.Execute
        Dim record : Set record = view.Fetch
        While Not record Is Nothing        
            If InStr(record.StringData(1), "RevitAddInUtility.dll") Then  
                record.StringData(1) = "REVITA~2.DLL|RevitAddInUtility32.dll"
                view.Modify msiViewModifyUpdate, record    
            ElseIf InStr(record.StringData(1), "RevitAddInUtility64.dll") Then    
                record.StringData(1) = "REVITA~1.DLL|RevitAddInUtility.dll"
                view.Modify msiViewModifyUpdate, record    
            End If    
            Set record = view.Fetch
        Wend
        database.Commit   
    End If
    
person Daren Thomas    schedule 24.08.2010
comment
Извините, вы только что сломали установку несколькими способами. Во-первых, вы изменили имя сборки без изменения фактического содержимого (что нарушит сборку .NET), а также вы создали нарушение правил компонента, изменив путь к ключу без изменения ComponentID. - person Christopher Painter; 24.08.2010
comment
на самом деле, я изменил имя сборки перед добавлением его в установку, а затем вернул его обратно на настоящее имя. Не могли бы вы предоставить указатель на keypath? Я признаю, что ковырялся в темноте в поисках короткой палки... - person Daren Thomas; 25.08.2010