2013-03-14 16 views
16

Ich habe versucht, meine benutzerdefinierte Aktion zu debuggen. Ich legte Debugger.Break() in benutzerdefinierte Aktion cs. Wenn ich benutzerdefinierte Aktion bauen schafft es diese Dateien:WIX benutzerdefinierte Aktion Debugging funktioniert nicht

myCustomAction.dll 
myCustomAction.CA.dll 
myCustomAction.pdb 

In wix Projekt I myCustomAction.CA.dll innerhalb binären Tags (nicht myCustomAction.dll) verweisen. Da gibt es nicht myCustomAction.CA.pdb ist dies der Grund, dass das Debuggen nicht funktioniert? Ich habe es auch mit messagebox probiert und angehängt zu verarbeiten, wenn Meldungsbox angezeigt wird. Aber ich bekomme die folgende Nachricht: Kann die PDB-Datei nicht finden oder öffnen.

Was mache ich falsch? Ich habe Wix 3.5 Version und Visual Studio 2010.

+0

Haben Sie das gesehen? http://stackoverflow.com/questions/2566977/no-debug-info-in-wix-managed-custom-action-using-visual-studio-integration –

+0

Ich habe ein Projekt des Typs C# Custom Action Project erstellt. Gibt es eine andere Einstellung? – Simon

Antwort

3

Mit DTF benutzerdefinierten Aktionen der beiden Techniken sind:

1) eine MessageBox in der benutzerdefinierten Aktion Setzen und dann Visual Studio zu diesem Prozess herstellen. Suchen Sie beim Anhängen nach rundll32-Prozess mit nativer und CLR-geladen.

2) Legen Sie die Umgebungsvariable MsiBreak auf den Namen Ihres Einstiegspunkts fest, und starten Sie den Computer neu. DTF wird den Debugger aufrufen, wenn diese benutzerdefinierte Aktion aufgerufen wird.

Ansonsten ist mein allgemeiner Vorschlag, dass Ihr Einstiegspunkt ein sehr dünner Furnier ist, der eine wiederverwendbare Klasse mit dem MSI verbindet. Normalerweise erstelle ich eine Stand-Alone-Klasse, in der ich Daten füttern und alles in einer Konsolen-App testen und dann diese Klasse mit DTF verbinden kann. Ich muss fast nie eine benutzerdefinierte Installeraktion debuggen.

Ansonsten weiß ich im Allgemeinen, das funktioniert.

+0

Wissen Sie, ob die Umgebungsvariable MMSIBREAK funktioniert, wenn die benutzerdefinierte Aktion Teil eines von mir erstellten Merge-Moduls ist? –

+0

Es ist so lange her, dass ich mich nicht mehr auswendig an eine komplette Lösung erinnern kann. Hier einige Highlights: Ich erinnere mich nicht, ob MMSIBREAK den Namen CustomAction oder den Namen des Einstiegspunkts in der DLL verwendet. Wenn Name der benutzerdefinierten Aktion der einzige Unterschied mit einem Mergemodul ist, wird der Name modularisiert (Name.GUID anstelle von Name). Wenn Eingangspunktname, kein Unterschied, da es keine Modularisierung gibt. –

+0

Eine weitere Überlegung ist, wenn die benutzerdefinierte Aktion in verzögerter Ausführung ohne Identitätswechsel ausgeführt wird und im Systemkontext ausgeführt wird. Sie müssen den Computer zuvor neu starten, um die von MSI erkannte Umgebungsvariable abzurufen. Dies ist ein Service Control Manager-Verhalten in Windows. –

43

Hier ist the article, die mir geholfen haben.

einfach den folgenden Code in der ersten Zeile der benutzerdefinierten Aktion hinzufügen:

System.Diagnostics.Debugger.Launch(); 

Dann einfach das Installationsprogramm ausführen. Wenn es beginnt, Ihre Aktion auszuführen, wird das Popup-Fenster mit dem Vorschlag angezeigt, Visual Studio zum Debuggen zu starten.

Ihre Referenzbibliothek ist korrekt, sie muss * .CA.dll sein. Auch der Ansatz mit MessageBox würde funktionieren, aber Sie müssen sich an den rundll32-Prozess anhängen.

+2

Dies sollte als die richtige Antwort markiert werden. –

+1

Es ist erwähnenswert, dass gemäß der [Dokumentation] (http://msdn.microsoft.com/en-us/library/aa368322%28VS.85%29.aspx) die 'MsiProcessMessage' (API hinter session.Log) nicht kann von einem ControlEvent verwendet werden. Dadurch verhindern Sie, dass Ihre Nachrichten in Ihrem Protokoll erscheinen - etwas, das mich eine Weile am Kopf kratzte! –

+0

Genau das, was ich gesucht habe! Vielen Dank! –

0

Dies ist neben der Verwendung von

System.Diagnostics.Debugger.Launch(); 

In einer Weise, die das Debuggen auf dem Remote-System, wie VM zu verbessern. Ich habe einige Änderungen in der WIX-Zieldatei vorgenommen, um die .CA.dll zu packen und ich habe ein gutes Ergebnis.

Im Zustand des ersten erstellen Artikel ich einen Scheck für % (ReferenceCopyLocalPaths.extension) ‚==‘ hinzugefügt PDB‘ auf diese Weise die meisten meiner Abhängigkeiten PDB jetzt enthalten sind meine .CA.dll IM- und Erlaube eine einfachere Debug-Erfahrung auf dem Remote-System.

C: \ Programme (x86) \ MSBuild \ Microsoft \ WiX \ v3.x \ wix.ca.Ziele

<Target Name="PackCustomAction" 
    Inputs="@(IntermediateAssembly);@(Content);$(CustomActionContents)" 
    Outputs="$(IntermediateOutputPath)$(TargetCAFileName)"> 

    <!-- Find all referenced items marked CopyLocal, but exclude non-binary files. --> 
    <CreateItem 
    Include="@(ReferenceCopyLocalPaths)" 
    Condition=" '%(ReferenceCopyLocalPaths.extension)' == '.pdb' or '%(ReferenceCopyLocalPaths.extension)' == '.dll' or '%(ReferenceCopyLocalPaths.extension)' == '.exe'"> 
     <Output TaskParameter="Include" ItemName="CustomActionReferenceContents"/> 
    </CreateItem> 
Verwandte Themen