Freigeben über


Debuggen einer T4-Textvorlage

Sie können Haltepunkte in Textvorlagen festlegen. Um eine Entwurfszeittextvorlage zu debuggen, speichern Sie die Textdatei, und wählen Sie dann im Kontextmenü der Datei im Projektmappen-Explorer die Option "T4-Vorlage debuggen" aus. Um eine Laufzeittextvorlage zu debuggen, debuggen Sie einfach die Anwendung, zu der sie gehört.

Zum Debuggen einer Textvorlage sollten Sie die Schritte des Vorlagentransformationsprozesses verstehen. In jedem Schritt können verschiedene Arten von Fehlern auftreten. Die Schritte sind wie folgt:

Schritt Entwurfszeitvorlage: Wann das passiert Laufzeitvorlage: Wann dies geschieht
Code wird aus der Textvorlage generiert.

Fehler in Direktiven oder nicht übereinstimmenden oder ungeordneten <#...#> Tags.
Wenn Sie die Vorlage speichern oder die Texttransformation aufrufen. Wenn Sie die Vorlage speichern oder die Texttransformation aufrufen.
Generierter Code wird kompiliert.

Kompilierungsfehler im Vorlagencode.
Unmittelbar nach dem vorherigen Schritt. Zusammen mit Ihrem Anwendungscode.
Code wird ausgeführt.

Laufzeitfehler im Vorlagencode.
Unmittelbar nach dem vorherigen Schritt. Wenn Die Anwendung ausgeführt wird und den Vorlagencode aufruft.

In den meisten Fällen werden Zeilennummern im Vorlagencode im Fehlerbericht angegeben. Wenn sich der Fehlerbericht auf einen temporären Dateinamen bezieht, ist die übliche Ursache eine nicht übereinstimmende Klammer im Code der Textvorlage.

Sie können Haltepunkte in Textvorlagen festlegen und auf übliche Weise debuggen.

Häufige Fehler und Korrekturen

In der folgenden Tabelle sind die häufigsten Fehler und deren Korrekturen aufgeführt.

Fehlermeldung Description Lösung
Fehler beim Laden der Basisklasse "{0}", von der die Transformationsklasse erbt. Tritt auf, wenn Sie die im Parameter in inherits einer Vorlagendirektive angegebene Basisklasse nicht finden können. Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Stellen Sie sicher, dass die angegebene Klasse vorhanden ist und dass die Assembly, in der sie vorhanden ist, in einer Assemblydirektive angegeben ist.
Fehler beim Auflösen des Include-Textes für die Datei:{0} Tritt auf, wenn Sie eine enthaltene Vorlage nicht finden können. Die Nachricht enthält den Namen der angeforderten Includedatei. Stellen Sie sicher, dass der Dateipfad relativ zum ursprünglichen Vorlagenpfad ist oder dass sich die Datei an einem Speicherort befindet, der beim Host registriert ist oder dass es einen vollständigen Pfad zu der Datei gibt.
Fehler wurden beim Initialisieren des Transformationsobjekts erzeugt. Die Transformation wird nicht ausgeführt. Tritt auf, wenn die 'Initialize()' der Transformationsklasse fehlgeschlagen oder falsch zurückgegeben wurde. Der Code in der Initialize()-Funktion stammt aus der basistransformationsklasse, die in der <#@template#> -Direktive und von Direktivenprozessoren angegeben ist. Der Fehler, der dazu führte, dass die Initialisierung fehlschlug, befindet sich wahrscheinlich in der Fehlerliste. Untersuchen Sie, warum der Fehler aufgetreten ist. Sie können den tatsächlich generierten Code für Initialize() betrachten, indem Sie die Verfahren zum Debuggen einer Vorlage ausführen.
Die Assembly "{0}" für den Direktivenprozessor "{1}" wurde nicht mit dem FullTrust-Berechtigungssatz ausgestattet. Nur vertrauenswürdige Assemblys dürfen Direktivenprozessoren bereitstellen. Dieser Direktivenprozessor wird nicht geladen. Tritt auf, wenn dem System keine Volltrust-Berechtigungen für eine Assembly erteilt wird, die einen Direktivenprozessor enthält. Die Nachricht enthält den Namen der Assembly und den Namen des Direktivenprozessors. Stellen Sie sicher, dass Sie nur vertrauenswürdige Assemblys auf dem lokalen Computer verwenden.
Der Pfad '{0}' muss entweder lokal auf diesem Computer oder Teil Ihrer vertrauenswürdigen Zone sein. Tritt auf, wenn eine Direktive oder Assemblydirektive auf eine Datei verweist, die sich nicht auf Ihrem lokalen Computer oder in der vertrauenswürdigen Zone Ihres Netzwerks befindet. Stellen Sie sicher, dass sich das Verzeichnis, in dem sich die Direktiven oder Assemblydirektiven befinden, in Ihrer vertrauenswürdigen Zone befindet. Sie können Ihrer vertrauenswürdigen Zone über Internet Explorer ein Netzwerkverzeichnis hinzufügen.
Mehrere Syntaxfehler wie "Ungültiges Token 'catch'" oder "Ein Namespace kann nicht direkt Mitglieder enthalten" Zu viele schließende geschweifte Klammern im Vorlagencode. Der Compiler verwechselt ihn mit dem Standard-Generierungscode. Überprüfen Sie die Anzahl der schließenden geschweiften und eckigen Klammern innerhalb von Codebegrenzungen.
Schleifen oder Bedingungen werden nicht ordnungsgemäß kompiliert oder ausgeführt. Beispiel: <#if (i>10)#> Number is: <#= i #>.

Dieser Code gibt immer den Wert von i aus. Nur "Nummer ist:" ist bedingt.
Verwenden Sie in C# immer geschweifte Klammern, um Textblöcke einzuschließen, die in Steuerelementanweisungen eingebettet sind. Fügen Sie geschweifte Klammern hinzu: <#if (i>10) { #> Number is: <#= i #><# } #>.
"Ausdruck zu komplex" beim Verarbeiten einer Entwurfszeitvorlage oder beim Kompilieren einer vorverarbeiteten Laufzeitvorlage.

Visual Studio funktioniert nicht mehr, wenn versucht wird, code zu prüfen, der von einer Laufzeitvorlage generiert wurde.
Textblock ist zu lang. T4 konvertiert Textblöcke in einen String-Konkatenierungsausdruck, mit einem Stringliteral für jede Vorlagenzeile. Sehr lange Textblöcke können die Größenbeschränkungen des Compilers überschreiten. Trennen Sie den langen Textblock mit einem Ausdrucksblock, z. B.:

<#= "" #>

Warnungsbeschreibungen und Korrekturen

In der folgenden Tabelle sind die am häufigsten verwendeten Warnungen zusammen mit Korrekturen aufgeführt, sofern verfügbar.

Warnmeldung Description Lösung
Beim Laden der Includedatei '{0}' wurde eine NULL- oder leere Zeichenfolge zurückgegeben. Tritt auf, wenn eine enthaltene Textvorlagendatei leer ist. Die Nachricht enthält den Dateinamen der enthaltenen Datei. Entfernen Sie entweder die Include-Direktive, oder stellen Sie sicher, dass die Datei inhalte enthält.
Kompilieren der Transformation: Fügt diese Zeichenfolge allen Fehlern oder Warnungen hinzu, die vom Compiler stammen, wenn dieser die Transformation kompiliert. Diese Zeichenfolge bedeutet, dass der Compiler einen Fehler oder eine Warnung ausgelöst hat. Wenn Sie ein Problem beim Auffinden der DLL haben, müssen Sie möglicherweise entweder den vollständigen Pfad oder einen vollqualifizierten starken Namen angeben, wenn sich die DLL im GAC befindet.
Der Parameter '{0}' ist bereits in der Direktive vorhanden. Der doppelte Parameter wird ignoriert. Tritt auf, wenn ein Parameter mehrmals in einer Direktive angegeben wird. Die Nachricht enthält den Namen des Parameters und die Zeilennummer der Direktive. Entfernen Sie die Spezifikation des doppelten Parameters.
Fehler beim Laden der Includedatei '{0}'. Die Include-Anweisung wird ignoriert. Tritt auf, wenn Sie eine in einer include Direktive angegebene Datei nicht finden können. Die Nachricht enthält den Namen der Datei und die Zeilennummer der Direktive. Stellen Sie sicher, dass die Includedatei entweder im selben Verzeichnis wie die ursprüngliche Textdatei oder in einem der include-Verzeichnisse vorhanden ist, die beim Host registriert sind.
Für die Transformationsklasse wurde eine ungültige Basisklasse angegeben. Die Basisklasse muss von Microsoft.VisualStudio.TextTemplating.TextTransformation abgeleitet werden. Tritt auf, wenn der inherits-Parameter in einer Vorlagendirektive eine Klasse angibt, die nicht von TextTransformation erbt. Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Geben Sie eine Klasse an, die von TextTransformation abgeleitet ist.
In der Anweisung "Template" wurde eine ungültige Kultur angegeben. Die Kultur muss sich im Format "xx-XX" befinden. Die invariante Kultur wird verwendet. Tritt auf, wenn der Kulturparameter in einer Vorlagendirektive falsch angegeben wird. Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Ändern Sie den Kulturparameter in eine gültige Kultur im Format "xx-XX".
In der Vorlagendirektive wurde ein ungültiger Debugwert '{0}' angegeben. Der Debugwert muss entweder "true" oder "false" sein. Der Standardwert von "false" wird verwendet. Tritt auf, wenn der debug Parameter in einer Vorlagendirektive falsch angegeben wird. Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Legen Sie den Debugparameter auf "true" oder "false" fest.
In der Vorlagendirektive wurde ein ungültiger HostSpecific-Wert '{0}' angegeben. Der HostSpecific-Wert muss entweder "true" oder "false" sein. Der Standardwert von "false" wird verwendet. Tritt auf, wenn der hostspezifische Parameter in einer template Direktive falsch angegeben wird. Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Legen Sie den hostspezifischen Parameter auf "true" oder "false" fest.
In der Direktive "Template" wurde eine ungültige Sprache "{0}" angegeben. Die Sprache muss entweder "C#" oder "VB" sein. Der Standardwert von "C#" wird verwendet. Tritt auf, wenn eine nicht unterstützte Sprache in der template Direktive angegeben wird. Es sind nur "C#" oder "VB" zulässig (Groß-/Kleinschreibung wird nicht beachtet). Die Nachricht stellt die Zeilennummer der Vorlagendirektive bereit. Legen Sie den language Parameter in der Vorlagendirektive auf "C#" oder "VB" fest.
In der Vorlage wurden mehrere Ausgabedirektiven gefunden. Alle außer die erste werden ignoriert. Tritt auf, wenn mehrere output Direktiven in einer Vorlagendatei angegeben werden. Die Nachricht stellt die Zeilennummer der duplizierten Ausgabedirektive bereit. Entfernen Sie doppelte output Direktiven.
In der Vorlage wurden mehrere Vorlagendirektiven gefunden. Alle außer der ersten werden ignoriert. Mehrere Parameter für die Vorlagendirektive sollten innerhalb einer Vorlagendirektive angegeben werden. Tritt auf, wenn Sie mehrere template Direktiven in einer Textdatei (einschließlich eingeschlossener Dateien) angeben. Die Nachricht gibt die Zeilennummer der doppelten Vorlagendirektive an. Aggregieren Sie die verschiedenen template Direktiven in einer template Richtlinie.
Für eine Direktive mit dem Namen '{0}' wurde kein Prozessor angegeben. Die Direktive wird ignoriert. Tritt auf, wenn Sie eine custom Direktive angeben, aber kein Attribut angeben processor . Die Nachricht enthält den Namen der Direktive und die Zeilennummer. Geben Sie ein processor Attribut mit dem Namen des directive Prozessors für die Direktive an.
Ein Prozessor mit dem Namen '{0}' konnte für die Direktive mit dem Namen '{1}' nicht gefunden werden. Die Direktive wird ignoriert. Tritt auf, wenn das System den directive in einer custom Direktive angegebenen Prozessor nicht finden kann. Die Nachricht enthält den Direktivennamen, den Prozessornamen und die Zeilennummer der Direktive. Legen Sie das processor Attribut in der Direktive auf den Namen des Direktivenprozessors fest.
Es wurde kein erforderlicher Parameter '{0}' für die Richtlinie '{1}' gefunden. Die Direktive wird ignoriert. Tritt auf, wenn das System keinen erforderlichen Direktivenparameter bereitstellt. Die Nachricht enthält den Namen des fehlenden Parameters, den Direktivennamen und die Zeilennummer. Geben Sie den fehlenden Parameter an.
Der Prozessor mit dem Namen '{0}' unterstützt die Direktive mit dem Namen '{1}' nicht. Die Direktive wird ignoriert. Tritt auf, wenn ein Direktivenprozessor keine Direktive unterstützt. Die Nachricht enthält den Namen und die Zeilennummer der verletzenden Direktive zusammen mit dem Namen des Direktivenverarbeiters. Korrigieren Sie den Namen der Direktive.
Die Includedirektive für die Datei "{0}" bewirkt eine endlose Schleife. Wird angezeigt, wenn zirkuläre Include-Direktiven angegeben werden (z. B. Datei A enthält Datei B, und Datei B enthält Datei A). Geben Sie keine zirkulären Einschlussanweisungen an.
Ausführen der Transformation: Fügt diese Zeichenfolge allen beim Ausführen des Vorgangs generierten Fehlern oder Warnungen voran. Nicht zutreffend.
Ein unerwartetes Start- oder End-Tag wurde innerhalb eines Blocks gefunden. Stellen Sie sicher, dass Sie kein Start- oder Endtag falsch eingegeben haben und keine geschachtelten Blöcke in der Vorlage enthalten sind. Wird angezeigt, wenn Sie ein unerwartetes <#- oder #>-Element haben. Das heißt, wenn Sie nach einem anderen geöffneten Tag, der nicht geschlossen wurde, eine <# haben, oder wenn Sie ein #> haben, ohne dass davor ein nicht geschlossenes geöffnetes Tag vorhanden ist. Die Nachricht stellt die Zeilennummer des nicht übereinstimmenden Tags bereit. Entfernen Sie entweder das nicht übereinstimmende Start- oder Endtag oder verwenden Sie ein Escape-Zeichen.
Eine Direktive wurde im falschen Format angegeben. Die Direktive wird ignoriert. Geben Sie die Direktive im Format an. <#@ name [parametername="parametervalue"]* #> Wird vom Parser angezeigt, wenn keine Direktive im richtigen Format angegeben ist. Die Nachricht stellt die Zeilennummer der falschen Direktive bereit. Stellen Sie sicher, dass sich alle Direktiven in der Form <#@ name [parametername="parametervalue"]* #>befinden. Weitere Informationen finden Sie unter T4 Textvorlagendirektiven.
Fehler beim Laden der Assembly '{0}' für den registrierten Direktivenprozessor '{1}'

{2}
Tritt auf, wenn ein Direktivenprozessor nicht vom Host geladen werden konnte. Die Nachricht identifiziert die Assembly, die für den Direktivenprozessor bereitgestellt wurde, sowie den Namen des Direktivenprozessors. Stellen Sie sicher, dass der Direktivenprozessor ordnungsgemäß registriert ist und dass die Assembly vorhanden ist.
Fehler beim Auffinden des Typs '{0}' in der Assembly '{1}' für den registrierten Direktivenverarbeiter '{2}'

{3}
Tritt auf, wenn ein Direktivenprozessortyp nicht aus seiner Assembly geladen werden konnte. Die Nachricht enthält den Namen des Typs, der Assembly und des Direktivenprozessors. Der vshost findet Direktivenprozessorinformationen (Name, Assembly und Typ) in der Registrierung. Stellen Sie sicher, dass der Direktivenprozessor ordnungsgemäß registriert ist und dass der Typ in der Assembly vorhanden ist.
Ein Problem gab es beim Laden der Assembly '{0}' Tritt auf, wenn beim Laden einer Assembly ein Problem auftritt. Die Nachricht enthält den Namen der Assembly. Sie können Assemblys angeben, die in <@#assembly#> -Direktiven und von Direktivenverarbeitern geladen werden sollen. Die fehlermeldung, die auf diese Zeichenfolge folgt, sollte weitere Daten enthalten, warum die Assemblylade fehlgeschlagen ist.
Problem beim Erstellen und Initialisieren des Prozessors für eine Direktive mit dem Namen "{1}". Der Typ des Prozessors ist {0}. Die Direktive wird ignoriert. Tritt auf, wenn das System einen Direktivenprozessor nicht erstellen oder initialisieren konnte. Die Nachricht enthält den Namen und die Zeilennummer der Direktive und den Typ des Prozessors. Stellen Sie sicher, dass Sie den richtigen Direktivenprozessor verwenden und dass der Direktivenprozessor über einen öffentlichen Standardkonstruktor verfügt. Verwenden Sie andernfalls die Debugoptionen, um herauszufinden, warum die Initialize()-Methode des Direktivenprozessors fehlschlägt. Weitere Informationen finden Sie unter "Problembehandlung bei Textvorlagen".
Beim Verarbeiten einer Direktive mit dem Namen "{0}' wurde eine Ausnahme ausgelöst. Tritt auf, wenn ein Direktivenprozessor eine Ausnahme auslöst, wenn eine Direktive verarbeitet wird. Stellen Sie sicher, dass die Parameter für den Direktivenprozessor korrekt sind.
Der Host hat beim Versuch, den Assemblyverweis "{0}" aufzulösen, eine Ausnahme ausgelöst. Tritt auf, wenn der Host eine Ausnahme auslöst, wenn versucht wird, einen Assemblyverweis aufzulösen. Die Nachricht stellt die Assemblyverweiszeichenfolge bereit. Assemblyverweise stammen aus <@#assembly#>-Direktiven und von Direktivenprozessoren. Stellen Sie sicher, dass der im Assemblyparameter angegebene Parameter "name" korrekt ist.
Versuch, den nicht unterstützten {1} Wert "{0}" für die Direktive anzugeben {2} Tritt durch den RequiresProvidesDirectiveProcessor auf (von dem alle unsere generierten Direktivenprozessoren abgeleitet sind), wenn Sie ein nicht unterstütztes 'requires' oder 'provides' Argument angeben. Stellen Sie sicher, dass die Namen in den als "name='value'"-Paaren bereitgestellten Parametern "requires" und "provides" korrekt sind.