2010-07-15 3 views
2

Lors de la création d'un projet d'installation Visual Studio 2010 avec un système CustomAction sur x64, Visual Studio inclut la mauvaise version de InstallUtilLib.dll: Il installe le shim 32 bits, qui ne fonctionnera pas pour CustomActions compilé en 64 bits (une exigence dans mon cas, car cela dépend des DLL natives 64 bits).Comment modifier le contenu/remplacer un fichier binaire d'un fichier .msi en tant qu'étape de post-construction?

L'installation d'un tel .msi entraîne l'exception System.BadImageFormat.

Selon this post (64-bit Managed Custom Actions with Visual Studio), la solution est d'ouvrir le .msi résultant en orca.exe et de remplacer le "InstallUtil" binaire.

Je voudrais automatiser ceci. Des idées?

EDIT: en fonction de la réponse fournie par mohlsen, j'ai ajouté le script suivant à la solution (et non le projet d'installation lui-même, en tant que fichiers ajoutés au projet d'installation aller dans le 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 

Ensuite, j'édita les propriétés des projets d'installation: Je mis la propriété PostBuildEvent à:

wscript.exe "$(ProjectDir)\..\Setup_PostBuildEvent_x64.vbs" $(BuiltOuputPath) 

Remarque: Un clic droit sur le projet d'installation en solutio n Explorer puis en sélectionnant "Propriétés" ouvre le mauvais dialogue ("Pages de propriétés"). Vous voulez la "fenêtre de propriétés" (CTRL + W, P).

+1

ugh! a dû utiliser "rem" au lieu de "pour les commentaires pour faire de la coloration syntaxique ne pas sucer trop ... –

Répondre

4

Vous ne savez pas comment automatiser cela, par script, code, etc. Mais dans tous les cas, cette fonctionnalité est disponible via le Windows Installer SDK, qui, je crois, fait partie du SDK Windows maintenant (utilisé pour être la plate-forme). SDK). Quoi qu'il en soit, voici un VBScript que j'ai utilisé dans le passé pour ajouter manuellement un fichier à un fichier MSI. Cela fait un moment, mais je l'ai juste couru sur un MSI pour tester, et vérifié avec Orca et l'assemblage a été ajouté à la table binaire. Cela devrait vous indiquer la bonne direction.

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 

Espérons que cela aide!

+0

wow, merci! va vérifier cela maintenant. Je posterai si je le fais fonctionner! –

+0

J'essaie actuellement ce script, mais j'ai l'erreur suivante: "Erreur: Modifier, Mode, Enregistrer" "Code: 80004005" – arc1880

Questions connexes