2017-05-02 4 views
1

Ich habe eine Inline-MSBuild-Task erstellt (wie beschrieben here), und ich möchte wissen, ob es eine Möglichkeit gibt, es in Visual Studio zu debuggen?Wie Debuggen einer Inline-MSBuild-Aufgabe?

Ich habe versucht, einen Aufruf an Debugger.Launch(), die tatsächlich den Debugger gestartet hat, aber Visual Studio konnte keine Quelldatei finden, die den C# -Code aus der Inline-Task entspricht.

Die einzige Sache, die ich jetzt denken kann, ist, den Code in eine reale Baugruppe zu setzen, anstatt es inline zu haben.

Antwort

1

Es gibt einen Weg, aber es ist nicht wirklich schön noch geeignet für die regelmäßige Verwendung. Aber es funktioniert:

  • Erstellen Sie eine Umgebungsvariable MSBUILDLOGCODETASKFACTORYOUTPUT und setzen Sie es auf 1 (der tatsächliche Wert spielt keine Rolle). Dies wird den generierten Code, der auch zum Kompilieren benutzt wurde, in eine Textdatei mit zufälliger GUID als Name und in das Verzeichnis von Path.GetTempPath()
  • run msbuild deponieren und wegen Debugger.Launch() den Dialog für Auswählen einer VS-Instanz; Wählen Sie den gewünschten aus
  • VS zeigt jetzt einen Dateidialog, der nach der Quelldatei fragt. Leider akzeptiert es nicht nur irgendeine Datei, sondern besteht auch auf der kompilierten
  • so durchsuchen Sie den Temp-Ordner, benennen Sie die neueste TXT-Datei (sollte die Quelle sein) auf den Namen der Dialog fragt
  • wählen Sie die Datei und klick 'OK' in der Datei-Dialog in VS, und es wird zeigen, der Debugger an der richtigen Zeile in dieser Datei angehalten
  • Etwas kürzer wäre es, Ihren Quellcode in eine CS-Datei bereits und verwenden <Code Type="Class" Language="cs" Source="path\to\inline.cs"> anstelle eines Fragments: Sie können die Einstellung MSBUILDLOGCODETASKFACTORYOUTPUT auslassen, da Sie die Datei bereits verwendet haben, sie aber immer noch umbenennen müssen.

    Also wenn Sie dies oft mit einer Assembly benötigen, werden Sie kürzer sein. Bequeme Art, dies in my answer here zu erreichen.

    Btw Ich fand die meisten dieser Informationen, indem Sie auf die CodeTaskFactory source. Es kann gesehen werden, dass es CompileAssemblyFromSource verwendet. Wenn Sie also eine kleine Änderung an der Quelle vornehmen würden, um stattdessen den Quellcode immer in eine Datei zu speichern, verwenden Sie stattdessen CompileAssemblyFromFile. Das funktioniert dann ohne weiteres.