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 TextTransformation klasy . 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. |