2009-09-27 8 views
3

J'ai un projet InstallShield MSI. Lorsque je passe un MSIHANDLE d'une action personnalisée InstallScript à un assembly managé initialisé via DotNetCoCreateObject(), la valeur reçue dans mon code managé est -2.MSI Log Debug Log Sink

Est-ce que quelqu'un sait s'il est possible d'accéder à un MSIHANDLE à partir d'une action personnalisée InstallScript qui appelle du code managé via DotNetCoCreateObject()? Je souhaite enregistrer mes résultats d'action personnalisés dans le même fichier journal que le reste de l'installation. J'utilise InstallShield 2010, Windows Installer 4.5 et .Net 3.5.

Répondre

4

Cela n'est possible que via une action personnalisée gérée et nécessite l'utilisation de InstallShield.Interop.Msi.dll de InstallShield pour obtenir le handle réel.

Pour écrire dans le fichier journal MSI à partir d'une action personnalisée gérée, cela fonctionne:

using (Msi.Install msi = Msi.CustomActionHandle(_msiHandle)) 
{ 
    using (Msi.Record record = new Msi.Record(100)) 
    { 
     record.SetString(0, "LOG: [1]"); 
     record.SetString(1, entry.Message); 
     msi.ProcessMessage(Msi.InstallMessage.Info, record); 
    } 
} 

NOTE: Au IS2010, InstallShield.Interop.Msi.dll est pas signé numériquement, de sorte que l'assemblage avec votre action personnalisée gérée doit également être non signé.

+0

Une autre chose à garder à l'esprit est que cela ne fonctionne que si le CustomAction n'a pas été appelé à partir d'un événement de contrôle sur un événement DoAction. J'ai une action personnalisée qui utilise cette approche pour écrire un message dans le journal. Pour tester cela, j'ai attaché l'action à une pression sur un bouton dans l'interface utilisateur et aussi comme une action dans InstallExecuteSequence. L'action attachée à l'interface utilisateur n'a pas consigné l'instruction, tandis que lorsque la même action a été exécutée dans le cadre de la commande ExecuteSequence, elle est entrée dans le journal. – ksun

+0

Apparemment, cela est dû au fait que MsiProcessMessage ne fonctionne pas à partir d'un événement de contrôle DoAction. Un moyen de contourner cela est de définir une propriété avec le message que vous souhaitez vous connecter. – ksun

+0

Je reçois ci-dessous erreur dans le journal MSI après l'ajout du code ci-dessus ----- Une exception a été levée par la cible d'une invocation. ---> System.IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'InstallShield.Interop.Msi, Version = 23.0.0.511, Culture = neutre, PublicKeyToken = null' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié. ---- J'ai ajouté cette DLL à mon projet et je peux voir dans le répertoire de sortie mais Comment charger InstallShield.Interop.Msi dll dans l'installateur? – Santhosh

0

Non, ce n'est pas possible. Vous devrez gérer vous-même la sortie de votre journal.

0

Un autre point de clarification est que IS a deux types de projets, InstallScript & MSI. Vous pouvez uniquement accéder au handle MSI dans les projets MSI.

Questions connexes