2010-08-24 5 views
0

Étant donné un programme d'installation généré avec un projet d'installation VS2010, je voudrais échanger une DLL .NET avec une autre sans changer le nom.Comment faire pour modifier le contenu d'un fichier inclus dans un * .msi avec VBScript

Je change déjà le fichier msi selon this question, échange le contenu d'une entrée dans la table « binaire ».

J'ai localisé le fichier en question en utilisant Orca. Il réside dans le seul fichier CAB. J'ai localisé ce fichier CAB dans le tableau "Media". Je ne sais pas comment changer ce fichier CAB (API) et je suppose que je devrais aussi changer certaines informations dans la base de données MSI (l'enregistrement "ProcessorArchitecture" pour l'assemblage dans la table "MsiAssemblyName").

Raison: Je fais un installateur pour un plugin Autodesk Revit 2011. Ceux-ci sont enregistrés en utilisant un ensemble RevitAddinUtility.dll qui doit être fourni avec l'installateur. Cet assemblage existe en deux versions, une pour les installations 32 bits et l'autre pour les installations 64 bits. J'ai besoin d'échanger la version correcte lors de la création de l'installateur, pour éviter d'écrire plus d'un installateur.

Répondre

0

Voici une solution que je utilise dans l'intervalle:

  • ajouter les deux fichiers, un nommé RevitAddinUtility.dll l'autre RevitAddinUtility64.dll
  • dans le Postbuild-Event, demander à l'utilisateur si le projet d'installation devrait être pour 64bit.
  • si oui, changer les noms des fichiers:

    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 
    
+0

Désolé, vous venez a cassé l'installation de plusieurs façons. Pour celui que vous avez changé le nom de l'assembly sans modifier le contenu réel (qui va casser un assembly .NET) et vous avez également créé une violation de la règle de composant en changeant le keypath sans modifier le ComponentID. –

+0

En fait, j'ai changé le nom de l'assembly * avant * de l'ajouter à l'installation puis de le * re-changer * pour le vrai nom par la suite. Pourriez-vous fournir un pointeur sur "keypath"? J'avoue piquer dans le noir avec un moyen de court bâton ici ... –

1

Commander cet article pour des moyens plus faciles à atteindre votre objectif:

RevitAddInUtility for 32 and 64 Bit Systems

+0

ah oui. Je l'ai lu et le genre de cerveau a pété aux implications. Merci! –

+0

(Mais la question elle-même n'est pas encore répondu - J'aimerais voir une réponse au cas générique du remplacement d'un fichier dans un msi!) –

+0

Il n'y a pas de cas générique. Vous mettez à jour la source du programme d'installation et reconstruisez le fichier MSI. Allez-vous jamais dans un assemblage construit et mettre à jour une classe avec un assembleur IL? Les MSI sont censés être transformables mais cela dépasse ce qu'une transformation devrait faire. –

Questions connexes