2010-07-22 2 views
3

action1Comment puis-je définir une propriété MSI à partir d'une action personnalisée C#, pour l'instant j'ai ceci mais comment puis-je obtenir le handle?MsiSetProperty à partir de l'action personnalisée C#

[DllImport("msi.dll", CharSet = CharSet.Unicode)] 
static extern int MsiSetProperty(IntPtr hInstall, string szName, string szValue); 

public void SetProperty(string propertyName, string propertyValue) 
{ 
    MsiSetProperty(handle, propertyName, propertyValue); 
} 

J'appelle le CA de WiX avec la ligne suivante

<CustomAction Id="CA1" BinaryKey="ca1.dll" DllEntry="action1" /> 

et l'action1 ressemble à ceci

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult action1(Session session) 
    { 
     session.Log("Begin action1"); 
     SetProperty("xyz", "123"); 
    } 
} 
+0

Créez-vous une bibliothèque d'actions personnalisées C# en utilisant les modèles WiX? – fletcher

+0

Oui, je suis. (ne peut pas poster moins de 15 caractères, est-ce que cela va.) –

+0

Pouvez-vous afficher les fonctions que vous appelez de WiX? Ceux avec l'attribut [CustomAction]. J'essaie juste de m'assurer que vous écrivez les actions personnalisées comme je pense que vous êtes ... Ces fonctions devraient avoir la signature suivante: public static ActionResult (session de session) – fletcher

Répondre

4

Vous devriez être en mesure de définir une propriété en procédant comme suit :

public class CustomActions 
{ 
    [CustomAction] 
    public static ActionResult action1(Session session) 
    { 
     string xyzProperty = "XYZ"; 

     session[xyzProperty] = "ABC"; 
    } 
} 

Voir Christopher poste de peintre ici:

http://blog.deploymentengineering.com/2008/05/deployment-tools-foundation-dtf-custom.html

Je suis sûr qu'il sera bientôt le long de commenter celui-ci.

+1

Maintenant je me sens comme une question troll. En DTF, nous n'avons pas accès au handle car techniquement, nous sommes à court de processus de MSI. L'objet de session est notre proxy sur un IPC de retour à une DLL non managée et il gère tous nos P/Invoke interop pour nous. Une autre astuce, les poignées existent toujours, alors assurez-vous de tirer parti des différentes implémentations d'IDispose dans DTF en plaçant des objets tels que les vues de base de données et les enregistrements dans les blocs Using(). Lorsque l'objet est hors de portée, il appelle Dispose(), ce qui entraîne la fermeture des différentes poignées MSI par le côté non géré. –

+0

Depuis que vous avez fait CA de type 1 C++ vous êtes sans doute au courant des choses funky que MSI peut faire lorsque vous ne parvenez pas à fermer les poignées. –

+0

Vos commentaires sont vraiment instructifs, j'ai beaucoup appris sur WiX à partir de ce site ... nous sommes presque en train de tirer sur InstallShield! – fletcher

Questions connexes