Udostępnij przez


Debugowanie szablonu tekstowego T4

Punkty przerwania można ustawić w szablonach tekstowych. Aby debugować szablon tekstowy w czasie projektowania, zapisz plik szablonu tekstowego, a następnie wybierz pozycję Debuguj szablon T4 w menu skrótów pliku w Eksploratorze 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.

Step Szablon czasu projektowania: kiedy to się dzieje Szablon czasu wykonywania: kiedy to się dzieje
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.
Kod działa.

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 Description 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. Wiadomość 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 odnaleźć tekstu dołączenia dla pliku:{0} Występuje, gdy nie można znaleźć dołączonego szablonu. Komunikat zawiera nazwę żądanego pliku dołączonego. 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 inicjalizacji, 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. Tylko zaufane zestawy mogą dostarczać procesory dyrektyw. 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 na tym komputerze 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ć członków" Zbyt wiele zamykających nawiasów klamrowych w kodzie szablonu. Kompilator myli to ze standardowym kodem generowania. Sprawdź liczbę zamykających nawiasów klamrowych i nawiasów wewnątrz ograniczników kodu.
Pętle lub instrukcje 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 konkatenacji 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 Description 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ę 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 w dyrektywie include. 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 parametr inherits w dyrektywie szablonu określa klasę, która nie dziedziczy z klasy TextTransformation. Wiadomość 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. Wiadomość 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. Wiadomość 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. Wiadomość 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 być "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). Wiadomość zawiera numer wiersza dyrektywy szablonu. Ustaw parametr w dyrektywie szablonu language na "C#" lub"VB".
W szablonie znaleziono wiele dyrektyw wyjściowych. Wszystko oprócz pierwszego zostanie zignorowane. 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. Wszystkie oprócz pierwszego zostaną zignorowane. 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. Podaj atrybut procesora o nazwie directive dla dyrektywy processor.
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 nie obsługuje dyrektywy. Komunikat zawiera nazwę i numer wiersza niepoprawnej dyrektywy wraz z nazwą procesora dyrektyw. 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 używać cyklicznych dyrektyw dołączania.
Trwa transformacja: Poprzedza ten ciąg wszystkimi błędami lub ostrzeżeniami generowanymi podczas uruchamiania przekształcenia. Nie dotyczy.
W bloku znaleziono nieoczekiwany znacznik początkowy lub końcowy. Upewnij się, że nie wpisałeś niewłaściwie tagu początkowego lub końcowego, i że nie masz zagnieżdżonych sekcji w szablonie. Wyświetlane, gdy masz nieoczekiwany <# lub #>. Oznacza to, że jeśli masz <# po innym otwartym tagu, który nie został zamknięty, lub masz #> gdy nie ma przed nim otwartego tagu, który nie został zamknięty. Komunikat zawiera numer linii 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 to, gdy host nie może załadować procesora dyrektywy. 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 typ procesora dyrektywy nie może być załadowany z jego zestawu. Komunikat zawiera nazwę procesora typu, zestawu i dyrektywy. vshost znajduje informacje o przetwarzarce dyrektyw (nazwa, zestaw, 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, które mają być załadowane, można określić w dyrektywach <@#assembly#> oraz przez procesory dyrektyw. Komunikat o błędzie, który pojawia się po tym ciągu, 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 referencyjny do zestawu. Odwołania do zestawów pochodzą z <dyrektyw @#assembly#> i procesorów dyrektyw. Upewnij się, że parametr "name" podany w parametrach zestawu jest właściwy.
Próba określenia nieobsługiwanej {1} wartości "{0}" dla dyrektywy {2} Występuje w elemencie RequiresProvidesDirectiveProcessor (wszystkie nasze wygenerowane procesory dyrektyw pochodzą z niego), gdy podasz nieobsługiwany argument requires lub provides. Upewnij się, że nazwy w parach name='value' podane w wymaganiach i podane parametry są poprawne.