Debuggen von DLLs in Visual Studio (C#, C++, Visual Basic, F#)

Eine DLL (Dynamic-Link Library) ist eine Bibliothek, die Code und Daten enthält, die von mehreren Apps verwendet werden können. Sie können mit Visual Studio DLLs erstellen, kompilieren, konfigurieren und debuggen.

Erstellen einer DLL

Die folgenden Visual Studio-Projektvorlagen können DLLs erstellen:

  • C#, Visual Basic oder F#: Klassenbibliothek
  • C# oder Visual Basic: Windows Forms-Steuerelementbibliothek (WCF)
  • C++-Dynamic Link Library (DLL)

Weitere Informationen finden Sie unter MFC Debugging Techniques (MFC-Debugverfahren).

Das Debuggen einer WCF-Bibliothek entspricht weitgehend dem Debuggen einer Klassenbibliothek. Weitere Informationen dazu finden Sie unter Windows Forms-Steuerelemente.

Normalerweise wird eine DLL von einem anderen Projekt aufgerufen. Wenn Sie das aufrufenden Projekt debuggen, können Sie in Abhängigkeit von der DLL-Konfiguration den DLL-Code schrittweise durchlaufen und debuggen.

DLL-Debugkonfiguration

Wenn Sie eine Visual Studio-Projektvorlage zum Erstellen einer App verwenden, werden die erforderlichen Einstellungen für die Debug- und Releasekonfigurationen automatisch durch Visual Studio festgelegt. Sie können diese Einstellungen ggf. ändern. Weitere Informationen finden Sie in den folgenden Artikeln:

Festlegen des C++-Attributs „Debuggable“

Damit der Debugger an eine C++-DLL angefügt werden kann, muss der C++-Code DebuggableAttribute ausgeben.

Zum Festlegen vonDebuggableAttribute:

  1. Wählen Sie das C++-DLL-Projekt im Projektmappen-Explorer aus, und wählen Sie das Symbol Eigenschaften aus, oder klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie dann Eigenschaften aus.

  2. Wählen Sie im Bereich Eigenschaften unter Linker>Debuggen die Option Ja (/ASSEMBLYDEBUG) für Debugfähige Assembly aus.

Weitere Informationen finden Sie unter /ASSEMBLYDEBUG.

Festlegen von C/C++-DLL-Dateispeicherorten

Zum Debuggen einer externen DLL muss ein aufrufendes Projekt in der Lage sein, die DLL, ihre PDB-Datei und alle anderen Dateien zu finden, die die DLL benötigt. Sie können eine benutzerdefinierte Buildaufgabe erstellen, um diese Dateien in den <Projektordner>\Debug-Ausgabeordner zu kopieren, oder Sie können die Dateien manuell dorthin kopieren.

Für C/C++-Projekte können Sie Header- und LIB-Dateispeicherorte in den Projekteigenschaftenseiten festlegen, anstatt sie in den Ausgabeordner zu kopieren.

So legen Sie C/C++-Header- und LIB-Dateispeicherorte fest:

  1. Wählen Sie das C/C++-DLL-Projekt im Projektmappen-Explorer aus, und wählen Sie das Symbol Eigenschaften aus, oder klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie dann Eigenschaften aus.

  2. Wählen Sie oben im Bereich Eigenschaften unter Konfiguration die Option Alle Konfigurationen aus.

  3. Geben Sie unter C/C++>Allgemein>Zusätzliche Includeverzeichnisse den Ordner an, der die Headerdateien enthält.

  4. Geben Sie unter Linker>Allgemein>Zusätzliche Bibliotheksverzeichnisse den Ordner mit LIB-Dateien an.

  5. Geben Sie unter Linker>Eingabe>Zusätzliche Abhängigkeiten den vollständigen Pfad und Dateinamen für die LIB-Dateien an.

  6. Klicken Sie auf OK.

Weitere Informationen zu C++-Projekteinstellungen finden Sie unter Referenz zur C++ Windows-Eigenschaftenseite.

Erstellen einer Debugversion

Stellen Sie sicher, dass Sie eine Debugversion der DLL erstellen, bevor Sie mit dem Debuggen beginnen. Zum Debuggen einer DLL muss eine aufrufende App in der Lage sein, ihre PDB-Datei und alle anderen Dateien zu finden, die die DLL benötigt.

Sie können eine benutzerdefinierte Buildaufgabe erstellen, um diese DLL-Dateien in den <Ordner des aufrufenden Projekts>\Debug-Ausgabeordner zu kopieren, oder Sie können die Dateien manuell dorthin kopieren.

Stellen Sie sicher, dass die DLL am richtigen Speicherort aufgerufen wird. Dies mag offensichtlich erscheinen, aber wenn eine aufrufenden App eine andere Kopie der DLL findet und lädt, wird der Debugger nie die von Ihnen festgelegten Haltepunkte erreichen.

Debuggen einer DLL

Eine DLL kann nicht direkt ausgeführt werden. Sie muss von einer App aufgerufen werden, in der Regel von einer EXE-Datei. Weitere Informationen dazu finden Sie unter Visual Studio-Projekte: C++.

Um eine DLL zu debuggen, können Sie das Debuggen aus der aufrufenden App starten oder aus dem DLL-Projekt debuggen, indem Sie die aufrufenden App angeben. Sie können auch das Direktfenster des Debuggers verwenden, um DLL-Funktionen oder -Methoden zur Entwurfszeit auszuwerten, ohne eine aufrufende App zu verwenden.

Weitere Informationen dazu finden Sie unter Erster Einblick in den Debugger.

Starten des Debuggens aus der aufrufenden App

Die folgenden Apps können eine DLL aufrufen:

  • Eine App aus einem Visual Studio-Projekt in derselben oder einer anderen Projektmappe als die DLL.
  • Eine vorhandene App, die bereits auf einem Test- oder Produktionscomputer bereitgestellt wurde und dort ausgeführt wird.
  • Eine App im Web, auf die über eine URL zugegriffen wird.
  • Eine Web-App mit einer Webseite, die die DLL einbettet.

Zum Debuggen einer DLL aus einer aufrufenden App können Sie folgendermaßen vorgehen:

  • Öffnen Sie das Projekt für die aufrufenden App, und starten Sie das Debuggen, indem Sie Debuggen>Debuggen starten auswählen oder F5 drücken.

    oder

  • Fügen Sie den Debugger an eine vorhandene App an, die bereits auf einem Test- oder Produktionscomputer bereitgestellt wurde und dort ausgeführt wird. Verwenden Sie diese Methode für DLLs auf Websites oder in Web-Apps. Weitere Informationen finden Sie unter Vorgehensweise: Anfügen an einen laufenden Prozess.

Bevor Sie mit dem Debuggen der aufrufenden App beginnen, legen Sie einen Breakpoint in der DLL fest. Weitere Informationen finden Sie unter Verwenden von Breakpoints. Sobald der DLL-Haltepunkt erreicht wird, können Sie den Code schrittweise ausführen und die in den einzelnen Zeilen ausgeführten Aktionen beobachten. Weitere Informationen finden Sie unter Navigieren im Code im Debugger.

Während des Debuggens können Sie das Fenster Module verwenden, um die DLLs und EXE-Dateien zu überprüfen, die von der App geladen werden. Wählen Sie zum Öffnen des Fensters Module während des Debuggens Debuggen>Windows>Module aus. Weitere Informationen finden Sie unter Vorgehensweise: Verwenden des Modulfensters.

Verwenden des Fensters „Direkt“

Sie können das Direktfenster verwenden, um DLL-Funktionen oder -Methoden zur Entwurfszeit auszuwerten. Das Direktfenster übernimmt die Rolle einer aufrufenden App.

Hinweis

Sie können das Direktfenster zur Entwurfszeit mit den meisten Projekttypen verwenden. Dies wird für SQL, Webprojekte oder Skripts nicht unterstützt.

Um beispielsweise eine Methode mit dem Namen Test in der Klasse Class1 zu testen, gehen Sie folgendermaßen vor:

  1. Öffnen Sie bei geöffneter DLL-Projekt das Direktfenster, indem Sie Debuggen>Windows>Direkt auswählen oder STRG+ALT+I drücken.

  2. Instanziieren Sie ein Objekt vom Typ Class1, indem Sie den folgenden C#-Code in das Direktfenster eingeben und die EINGABETASTE drücken. Dieser verwaltete Code kann mit entsprechenden Syntaxänderungen in C# und Visual Basic eingesetzt werden:

    Class1 obj = new Class1();
    

    In C# müssen alle Namen vollqualifiziert sein. Alle Methoden oder Variablen müssen sich im aktuellen Gültigkeitsbereich und Kontext befinden, wenn der Sprachdienst versucht, den Ausdruck auszuwerten.

  3. Vorausgesetzt, dass Test einen int -Parameter annimmt, werten Sie Test mit dem Direktfenster aus:

    ?obj.Test(10);
    

    Das Ergebnis wird im Direktfenster ausgegeben.

  4. Sie können mit dem Debuggen von Test fortfahren, indem Sie einen Haltepunkt einfügen und anschließend die Funktion erneut auswerten.

    Sobald der Breakpoint erreicht ist, können Sie Test in Einzelschritten durchlaufen. Nach der Ausführung von Test befindet sich der Debugger wieder im Entwurfsmodus.

Debuggen im gemischten Modus

Sie können eine aufrufende App für eine DLL in verwaltetem oder nativem Code schreiben. Wenn Ihre native App eine verwaltete DLL aufruft und Sie beide debuggen möchten, können Sie sowohl die verwalteten als auch die nativen Debugger in den Projekteigenschaften aktivieren. Die genaue Vorgehensweise hängt davon ab, ob Sie den Debugvorgang über das DLL-Projekt oder über das Projekt der aufrufende Anwendung starten möchten. Weitere Informationen finden Sie unter Vorgehensweise: Debuggen im gemischten Modus.

Sie können eine native DLL auch aus einem verwalteten aufrufenden Projekt debuggen. Weitere Informationen finden Sie unter Vorgehensweise: Debuggen von verwaltetem und nativem Code.