Udostępnij za pośrednictwem


Debugowanie szablonu tekstowego T4

Punkty przerwania można ustawić w szablonach tekstowych. Aby debugować szablon tekstowy w czasie projektowania, zapisz plik szablonu tekstu, a następnie wybierz pozycję Debug T4 Template (Debuguj szablon T4) w menu skrótów pliku w Eksplorator rozwiązań. Aby debugować szablon tekstowy w czasie wykonywania, po prostu debuguj aplikację, do której należy.

Aby debugować szablon tekstowy, należy zrozumieć kroki procesu przekształcania szablonu. W każdym kroku mogą wystąpić różne rodzaje błędów. Kroki są następujące.

Krok Szablon czasu projektowania: kiedy to się stanie Szablon czasu wykonywania: w takim przypadku
Kod jest generowany na podstawie szablonu tekstowego.

Błędy w dyrektywach lub niedopasowane lub nieuporządkowane <#...#> tagi.
Podczas zapisywania szablonu lub wywoływania przekształcenia tekstu. Podczas zapisywania szablonu lub wywoływania przekształcenia tekstu.
Wygenerowany kod jest kompilowany.

Błędy kompilacji w kodzie szablonu.
Natychmiast po poprzednim kroku. Wraz z kodem aplikacji.
Uruchamiany jest kod.

Błędy czasu wykonywania w kodzie szablonu.
Natychmiast po poprzednim kroku. Po uruchomieniu aplikacji i wywołaniu kodu szablonu.

W większości przypadków numery wierszy w kodzie szablonu są podane w raporcie o błędach. Gdy raport o błędach odwołuje się do tymczasowej nazwy pliku, zwykłą przyczyną jest niedopasowany nawias w kodzie szablonu tekstowego.

Punkty przerwania można ustawić w szablonach tekstowych i debugować w zwykły sposób.

Typowe błędy i poprawki

W poniższej tabeli wymieniono najczęstsze błędy i ich poprawki.

Komunikat o błędzie opis Rozwiązanie
Nie można załadować klasy bazowej "{0}", z której dziedziczy klasa Transformation. Występuje, jeśli nie można znaleźć klasy bazowej określonej w parametrze inherits w dyrektywie szablonu. Komunikat zawiera numer wiersza dyrektywy szablonu. Upewnij się, że określona klasa istnieje i że zestaw, w nim istnieje, jest określony w dyrektywie zestawu.
Nie można rozpoznać tekstu dołączania do pliku:{0} Występuje, gdy nie można znaleźć dołączonego szablonu. Komunikat zawiera nazwę żądanego pliku dołączania. Upewnij się, że ścieżka pliku jest względna względem oryginalnej ścieżki szablonu lub że plik znajduje się w lokalizacji zarejestrowanej na hoście lub że istnieje pełna ścieżka do pliku.
Błędy zostały wygenerowane podczas inicjowania obiektu przekształcania. Przekształcenie nie zostanie uruchomione. Występuje, gdy "Initialize()" klasy transformacji nie powiodło się lub zwróciło wartość false. Kod w funkcji Initialize() pochodzi z klasy transformacji podstawowej określonej w <dyrektywie #@template#> i z procesorów dyrektywy. Błąd, który spowodował niepowodzenie, prawdopodobnie znajduje się na liście błędów. Sprawdź, dlaczego nie powiodło się. Możesz przyjrzeć się rzeczywistemu wygenerowanemu kodowi initialize(), wykonując procedury debugowania szablonu.
Zestaw "{0}" dla procesora dyrektywy "{1}" nie otrzymał zestawu uprawnień FullTrust. Procesory dyrektywy mogą udostępniać tylko zaufane zestawy. Ten procesor dyrektywy nie zostanie załadowany. Występuje, gdy system nie udziela uprawnień FullTrust do zestawu zawierającego procesor dyrektywy. Komunikat zawiera nazwę zestawu i nazwę procesora dyrektywy. Upewnij się, że na komputerze lokalnym są używane tylko zaufane zestawy.
Ścieżka "{0}" musi być lokalna dla tego komputera lub części zaufanej strefy. Występuje, gdy dyrektywa lub dyrektywa zestawu odwołuje się do pliku, który nie znajduje się na komputerze lokalnym lub w zaufanej strefie sieci. Upewnij się, że katalog, w którym znajdują się dyrektywy lub dyrektywy zestawu, znajduje się w zaufanej strefie. Katalog sieciowy można dodać do strefy zaufanej za pomocą programu Internet Explorer.
Wiele błędów składniowych, takich jak "Nieprawidłowy token "catch" lub "Przestrzeń nazw nie może bezpośrednio zawierać elementów członkowskich" Zbyt wiele zamykających nawiasów klamrowych w kodzie szablonu. Kompilator jest mylący z kodem standardowej generacji. Sprawdź liczbę zamykających nawiasów klamrowych i nawiasów wewnątrz ograniczników kodu.
Pętle lub warunkowe nie zostały skompilowane lub wykonane poprawnie. Na przykład: <#if (i>10)#> Number is: <#= i #>.

Ten kod zawsze generuje wartość i. Tylko "Liczba jest:" jest warunkowa.
W języku C# zawsze należy używać nawiasów klamrowych do otaczania bloków tekstu osadzonych w instrukcjach sterujących. Dodaj nawiasy klamrowe: <#if (i>10) { #> Number is: <#= i #><# } #>.
"Wyrażenie jest zbyt złożone" podczas przetwarzania szablonu czasu projektowania lub kompilowania szablonu środowiska uruchomieniowego (wstępnie przetworzonego).

Program Visual Studio przestaje działać podczas próby sprawdzenia kodu wygenerowanego przez szablon środowiska uruchomieniowego.
Blok tekstu jest za długi. T4 konwertuje bloki tekstowe na wyrażenie łączenia ciągów z jednym literałem ciągu dla każdego wiersza szablonu. Bardzo długie bloki tekstowe mogą przekraczać limity rozmiaru kompilatora. Podziel długi blok tekstowy na blok wyrażeń, taki jak:

<#= "" #>

Opisy ostrzeżeń i poprawki

W poniższej tabeli wymieniono najbardziej typowe ostrzeżenia wraz z poprawkami, jeśli są dostępne.

Komunikat ostrzegawczy opis Rozwiązanie
Załadowanie pliku dołączania "{0}" zwróciło ciąg o wartości null lub pusty. Występuje, jeśli dołączony plik szablonu tekstowego jest pusty. Komunikat zawiera nazwę pliku dołączonego pliku. Usuń dyrektywę include lub upewnij się, że plik ma pewną zawartość.
Kompilowanie przekształcenia: Poprzedza ten ciąg wszystkimi błędami lub ostrzeżeniami pochodzącymi z kompilatora podczas kompilowania przekształcenia. Ten ciąg oznacza, że kompilator rzucił błąd lub ostrzeżenie. Jeśli masz problem ze znalezieniem biblioteki DLL, może być konieczne podanie pełnej ścieżki lub w pełni kwalifikowanej silnej nazwy, jeśli biblioteka DLL znajduje się w GAC.
Parametr "{0}" już istnieje w dyrektywie. Zduplikowany parametr zostanie zignorowany. Występuje, gdy parametr jest określony więcej niż raz w dyrektywie. Komunikat zawiera nazwę parametru i numer wiersza dyrektywy. Usuń zduplikowaną specyfikację parametru.
Wystąpił błąd podczas ładowania pliku dołączania "{0}". Dyrektywa include zostanie zignorowana. Występuje, gdy nie można znaleźć pliku określonego include w dyrektywie. Komunikat zawiera nazwę pliku i numer wiersza dyrektywy. Upewnij się, że plik dołączania istnieje w tym samym katalogu co oryginalny plik szablonu tekstowego lub w jednym z katalogów dołączania zarejestrowanych w hoście.
Określono nieprawidłową klasę bazową dla klasy Transformation. Klasa bazowa musi pochodzić z klasy Microsoft.VisualStudio.TextTemplating.TextTransformation. Występuje, gdy inherits parametr w dyrektywie szablonu określa klasę, która nie dziedziczy z TextTransformationklasy . Komunikat zawiera numer wiersza dyrektywy szablonu. Określ klasę, która pochodzi z klasy TextTransformation.
W dyrektywie "template" określono nieprawidłową kulturę. Kultura musi być w formacie "xx-XX". Będzie używana niezmienna kultura. Występuje, gdy parametr kultury w dyrektywie szablonu jest niepoprawnie określony. Komunikat zawiera numer wiersza dyrektywy szablonu. Zmień parametr kultury na prawidłową kulturę w formacie "xx-XX".
Nieprawidłowa wartość debugowania "{0}" została określona w dyrektywie szablonu. Wartość debugowania musi mieć wartość "true" lub "false". Zostanie użyta wartość domyślna "false". Występuje, gdy debug parametr w dyrektywie szablonu jest niepoprawnie określony. Komunikat zawiera numer wiersza dyrektywy szablonu. Ustaw parametr debugowania na wartość "true" lub "false".
Nieprawidłowa wartość HostSpecific "{0}" została określona w dyrektywie szablonu. Wartość HostSpecific musi mieć wartość "true" lub "false". Zostanie użyta wartość domyślna "false". Występuje, gdy parametr specyficzny dla hosta w template dyrektywie jest niepoprawnie określony. Komunikat zawiera numer wiersza dyrektywy szablonu. Ustaw parametr specyficzny dla hosta na wartość "true" lub "false".
W dyrektywie "template" określono nieprawidłowy język{0} "". Język musi mieć wartość "C#" lub "VB". Zostanie użyta wartość domyślna "C#". Występuje, gdy w template dyrektywie określono nieobsługiwany język. Dozwolone są tylko "C#" lub "VB" (bez uwzględniania wielkości liter). Komunikat zawiera numer wiersza dyrektywy szablonu. Ustaw parametr w dyrektywie szablonu language na "C#" lub"VB".
W szablonie znaleziono wiele dyrektyw wyjściowych. Wszystkie, ale pierwszy zostanie zignorowany. Występuje, gdy w pliku szablonu określono wiele output dyrektyw. Komunikat zawiera numer wiersza zduplikowanej dyrektywy wyjściowej. Usuń zduplikowane output dyrektywy.
W szablonie znaleziono wiele dyrektyw szablonu. Wszystkie, ale pierwszy zostanie zignorowany. W jednej dyrektywie szablonu należy określić wiele parametrów dyrektywy szablonu. Występuje w przypadku określenia wielu template dyrektyw w pliku szablonu tekstowego (w tym dołączonych plików). Komunikat zawiera numer wiersza zduplikowanej dyrektywy szablonu. Agregowanie różnych template dyrektyw do jednej template dyrektywy.
Nie określono procesora dla dyrektywy o nazwie "{0}". Dyrektywa zostanie zignorowana. Występuje, jeśli określisz dyrektywę custom , ale nie podaj atrybutu processor . Komunikat zawiera nazwę dyrektywy i numer wiersza. processor Podaj atrybut o nazwie directive procesora dla dyrektywy.
Nie można odnaleźć procesora o nazwie "{0}" dla dyrektywy o nazwie "{1}". Dyrektywa zostanie zignorowana. Występuje, gdy system nie może odnaleźć directive procesora określonego custom w dyrektywie. Komunikat zawiera nazwę dyrektywy, nazwę procesora i numer wiersza dyrektywy. processor Ustaw atrybut w dyrektywie na nazwę procesora dyrektywy.
Nie można odnaleźć wymaganego parametru "{0}" dla dyrektywy "{1}". Dyrektywa zostanie zignorowana. Występuje, gdy system nie dostarcza wymaganego parametru dyrektywy. Komunikat zawiera nazwę brakującego parametru, nazwę dyrektywy i numer wiersza. Podaj brakujący parametr.
Procesor o nazwie "{0}" nie obsługuje dyrektywy o nazwie "{1}". Dyrektywa zostanie zignorowana. Występuje, gdy procesor dyrektywy nie obsługuje dyrektywy. Komunikat zawiera nazwę i numer wiersza dyrektywy o przestępstwach wraz z nazwą procesora dyrektywy. Popraw nazwę dyrektywy.
Dyrektywa include dla pliku "{0}" powoduje nieskończoną pętlę. Wyświetlane, jeśli określono dyrektywy dołączania cyklicznego (na przykład plik A zawiera plik B, który zawiera plik A). Nie należy określać dyrektyw dołączania cyklicznego.
Uruchomiona transformacja: Poprzedza ten ciąg wszystkimi błędami lub ostrzeżeniami generowanymi podczas uruchamiania przekształcenia. Nie dotyczy.
W bloku znaleziono nieoczekiwany tag początkowy lub końcowy. Upewnij się, że nie wpisać nieprawidłowo tagu początkowego lub końcowego i że nie masz żadnych zagnieżdżonych bloków w szablonie. Wyświetlane, gdy masz nieoczekiwany <numer lub #>. Oznacza to, że jeśli masz <plik # po innym otwartym tagu, który nie został zamknięty, lub masz plik #> w przypadku braku nieujawnianego otwartego tagu przed nim. Komunikat zawiera numer wiersza niedopasowanego tagu. Usuń niezgodność tagu początkowego lub końcowego albo użyj znaku ucieczki.
Dyrektywa została określona w niewłaściwym formacie. Dyrektywa zostanie zignorowana. Określ dyrektywę w formacie <#@ name [parametername="parametervalue"]* #> Wyświetlane przez analizator, jeśli dyrektywa nie jest określona w poprawnym formacie. Komunikat zawiera numer wiersza nieprawidłowej dyrektywy. Upewnij się, że wszystkie dyrektywy mają postać <#@ name [parametername="parametervalue"]* #>. Aby uzyskać więcej informacji, zobacz T4 Text Template Directives (Dyrektywy szablonu tekstowego T4).
Nie można załadować zestawu "{0}" dla zarejestrowanego procesora dyrektywy "{1}"

{2}
Występuje, gdy nie można załadować procesora dyrektywy przez hosta. Komunikat identyfikuje zestaw podany dla procesora dyrektywy i nazwę procesora dyrektywy. Upewnij się, że procesor dyrektywy jest poprawnie zarejestrowany i że zestaw istnieje.
Nie można odnaleźć typu "{0}" w zestawie "{1}" dla zarejestrowanego procesora dyrektywy "{2}"

{3}
Występuje, gdy nie można załadować typu procesora dyrektywy z zestawu. Komunikat zawiera nazwę procesora typu, zestawu i dyrektywy. Vshost znajduje informacje o procesorze dyrektywy (nazwa, zestaw i typ) w rejestrze. Upewnij się, że procesor dyrektywy jest poprawnie zarejestrowany i że typ istnieje w zestawie.
Wystąpił problem podczas ładowania zestawu "{0}" Występuje, gdy występuje problem podczas ładowania zestawu. Komunikat zawiera nazwę zestawu. Zestawy do załadowania można określić w <dyrektywach @#assembly#> oraz przez procesory dyrektywy. Komunikat o błędzie, który jest zgodny z tym ciągiem, powinien dostarczyć więcej danych na temat przyczyny niepowodzenia ładowania zestawu.
Wystąpił problem podczas tworzenia i inicjowania procesora dla dyrektywy o nazwie "{1}". Typ procesora to {0}. Dyrektywa zostanie zignorowana. Występuje, gdy system nie może utworzyć lub zainicjować procesora dyrektywy. Komunikat zawiera nazwę i numer wiersza dyrektywy oraz typ procesora. Upewnij się, że używasz poprawnego procesora dyrektywy i że procesor dyrektywy ma publiczny konstruktor domyślny. W przeciwnym razie użyj opcji debugowania, aby dowiedzieć się, dlaczego metoda Initialize() procesora dyrektywy kończy się niepowodzeniem. Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z szablonami tekstu.
Wyjątek został zgłoszony podczas przetwarzania dyrektywy o nazwie "{0}". Występuje, gdy procesor dyrektywy zgłasza wyjątek podczas przetwarzania dyrektywy. Upewnij się, że parametry procesora dyrektywy są poprawne.
Host rzucił wyjątek podczas próby rozwiązania odwołania do zestawu "{0}". Występuje, gdy host zgłasza wyjątek podczas próby rozwiązania odwołania do zestawu. Komunikat zawiera ciąg odwołania do zestawu. Odwołania do zestawów pochodzą z <dyrektyw @#assembly#> i z procesorów dyrektywy. Upewnij się, że parametr "name" podany w parametrze zestawu jest poprawny.
Próba określenia nieobsługiwanej {1} wartości "{0}" dla dyrektywy {2} Występuje przez element RequiresProvidesDirectiveProcessor (wszystkie wygenerowane procesory dyrektywy pochodzą z niego), gdy podajesz nieobsługiwane wymagania lub argument. Upewnij się, że nazwy w parach name='value' podane w wymaganiach i podane parametry są poprawne.