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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 24 августа 2010

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

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

0 голосов
/ 24 августа 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
    
...