it-swarm.com.de

Wie debuggen Sie die Klassenbibliothek, die von einer externen App aufgerufen wurde?

Es gibt einen externen Workflow, der C # -Scripts ausführt und mit DLL -Dateien (meiner Klassenbibliothek) arbeiten kann.

Ist es möglich, einem Klassenbibliotheksprojekt ein Debugging beizufügen, so dass der Haltepunkt erreicht wird, sobald WF es anruft?

Vielen Dank

23
Sergejs

Ja, das können Sie mit Visual Studio machen. Sie haben zwei Möglichkeiten:

Konfigurieren Sie Ihr Projekt, um das externe Programm zu starten

  1. Öffnen Sie Ihr DLL - Projekt.

  2. Wechseln Sie in den Eigenschaften des Projekts zur Registerkarte Debug .

  3. Wählen Sie Externes Programm starten und geben Sie den Pfad des externen Programms an, das Ihre DLL aufrufen soll, zusammen mit den Befehlszeilenargumenten, die Sie möglicherweise angeben müssen, und dem Arbeitsverzeichnis, falls dies relevant ist.

  4. Speichern Sie das Projekt.

  5. Setzen Sie Haltepunkte in Ihrem Code an den gewünschten Stellen.

  6. Drücken Sie F5, um das Debuggen zu starten. (An diesem Punkt sagen deine Haltepunkte, dass sie nicht getroffen werden, weil die Symbole nicht geladen sind. Mach dir darüber keine Sorgen.)

  7. Tun Sie, was immer Sie tun, damit die externe Anwendung Ihre Bibliothek lädt und Ihren Code ausführt.

Visual Studio erkennt das Laden des Moduls, lädt die Symbole und stoppt am Haltepunkt.

An einen vorhandenen Prozess anhängen

Wenn Sie den Prozess nicht starten können, sondern eine Verbindung zu einem bereits laufenden Prozess herstellen müssen, können Sie dies auch tun:

(Randbemerkung: Wenn Sie die "Express" - Edition von Visual Studio verwenden, kann ich nicht denke es hat diese Funktion, aber ich bin mir nicht sicher. Das ist einfach genug: Sie zu sagen Ich habe entweder den in Schritt 4 genannten Menüpunkt oder nicht.)

  1. Stellen Sie sicher, dass der Prozess ausgeführt wird.

  2. Öffnen Sie Ihr DLL - Projekt.

  3. Setzen Sie Ihre Haltepunkte usw.

  4. Wählen Sie im Menü Debug die Option Zum Prozess hinzufügen ...

  5. Suchen Sie im daraufhin angezeigten Dialogfeld den Prozess in der Liste, markieren Sie ihn und klicken Sie auf Attach .

  6. Visual Studio wechselt in den Debug-Modus. (An diesem Punkt sagen deine Haltepunkte, dass sie nicht getroffen werden, weil die Symbole nicht geladen sind. Mach dir darüber keine Sorgen.)

  7. Tun Sie, was immer Sie tun, um den externen Prozess zu laden und Ihren Code auszuführen.

Visual Studio erkennt die Modullast im externen Prozess, lädt Ihre Symbole und stoppt an Ihrem Haltepunkt.


N.B. Wenn der externe Prozess Ihre DLL von einem anderen Ort als dem Ordner bin/Debug Ihres Projekts lädt, müssen Sie in beiden Fällen sicherstellen, dass Sie die DLL bei jedem Erstellen an diesen anderen Speicherort kopieren it (Sie können dies in den Projektoptionen automatisch einstellen). Andernfalls kann Visual Studio nicht erkennen, dass die zu ladende DLL die ist, die Sie debuggen möchten.

25
T.J. Crowder

Sie können den Befehl Attach to process aus dem Menü Debug zum Debuggen Ihres DLL - Projekts verwenden. Möglicherweise müssen Sie das Debuggen im gemischten Modus verwenden, wenn bei nativem Code kein Debugging erfolgt. Dies kann durch Auswählen des Codetyps Managed und Native in dem Fenster erfolgen, das angezeigt wird, wenn Sie auf die Schaltfläche Select im Fenster Attach to process klicken.

Wenn die von Ihnen verwendete Edition von Visual Studio Makros unterstützt, können Sie mit dem folgenden Code ein neues Makro erstellen, um all dies zu automatisieren:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module AttachToProcess

    Public Sub DebugMyDLL()
        DTE.ExecuteCommand("Build.BuildSelection")
        Dim ApplicationExePath As String = "C:\Program Files (x86)\foo\bar.exe"
        Shell(ApplicationExePath)
        Try
            Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
            Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
            Dim dbgeng(2) As EnvDTE80.Engine
            dbgeng(0) = trans.Engines.Item("Managed (v4.0)")
            dbgeng(1) = trans.Engines.Item("Native")
            Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "<QualifierName>").Item("bar.exe")
            proc2.Attach2(dbgeng)
        Catch ex As System.Exception
            MsgBox(ex.Message)
        End Try
    End Sub

End Module

Das obige Makro versucht, Ihr Projekt zu erstellen, startet die externe Anwendung und fügt Ihrem Programm dann automatisch DLL hinzu. Sie können den QualifierName für Ihr System über das Fenster Attach to process abrufen. Die Version von verwaltetem Code ("Managed (v4.0)" in diesem Fall) hängt auch von der verwendeten .NET Framework-Version ab.

2
Manas Jog

Wenn Sie keine externe App verwenden möchten/können, können Sie die Klassenbibliothek direkt von Visual Studio aus aufrufen: Ctrl+Alt+I zur Anzeige von "Immediate" Widow. Dann können Sie von dort aus eine beliebige Methode aus Ihrer Klassenbibliothek aufrufen (Haltepunkte verwenden). Sie müssen vollständig qualifizierte Namen (d. H. Namespaces) eingeben.

1
alexkovelsky

Ich denke, heutzutage ist es aktueller, ein Unit-Testprojekt zu erstellen , um Ihren Bibliothekscode auszuführen. So schlagen Sie zwei Fliegen mit einer Klappe: Sie können Ihr Projekt in derselben Lösung debuggen und Ihren Code übrigens durch Tests abdecken.

0
rock_walker