Depurando um modelo de texto T4
Você pode definir pontos de interrupção em modelos de texto. Para depurar um modelo de texto em tempo de design, salve o arquivo de modelo de texto e escolha Depurar Modelo T4 no menu de atalho do arquivo no Gerenciador de Soluções. Para depurar um modelo de texto em tempo de execução, basta depurar o aplicativo ao qual ele pertence.
Para depurar um modelo de texto, você deve entender as etapas do processo de transformação dele. Diferentes tipos de erros podem ocorrer em cada etapa. As etapas são listadas a seguir.
Etapa | Modelo de tempo de design: quando acontece | Modelo de tempo de execução: quando acontece |
---|---|---|
O código é gerado com base no modelo de texto. Erros em diretivas ou marcas <#...#> incompatíveis ou desordenadas. |
Quando você salva o modelo ou invoca a transformação de texto. | Quando você salva o modelo ou invoca a transformação de texto. |
O código gerado é compilado. Erros de compilação no código do modelo. |
Logo após a etapa anterior. | Junto com o código do aplicativo. |
Execuções de código. Erros em tempo de execução no código do modelo. |
Logo após a etapa anterior. | Quando o aplicativo é executado e invoca o código do modelo. |
Na maioria dos casos, os números de linha no código do modelo são fornecidos no relatório de erros. Quando o relatório de erros se refere a um nome de arquivo temporário, a causa costuma ser um colchete incompatível no código do modelo de texto.
Você pode definir pontos de interrupção em modelos de texto e depurar da maneira usual.
Erros e correções comuns
A tabela a seguir lista os erros mais comuns e as respectivas correções.
Mensagem de erro | Descrição | Solução |
---|---|---|
Falha ao carregar a classe base '{0}' da qual a classe Transformation foi herdada. | Ocorrerá se você não encontrar a classe base especificada no parâmetro inherits em uma diretiva de modelo. A mensagem fornece o número de linha da diretiva de modelo. |
Verifique se a classe especificada existe e se o assembly em que ela existe está especificado em uma diretiva de assembly. |
Falha ao resolver o texto incluso para o arquivo: {0} | Ocorre quando você não encontra um modelo incluído. A mensagem fornece o nome do arquivo de inclusão solicitado. | Verifique se o caminho do arquivo é relativo ao caminho do modelo original ou se o arquivo está em um local registrado com o host, ou se há um caminho completo para o arquivo. |
Erros foram gerados ao inicializar o objeto de transformação. A transformação não será executada. | Ocorre quando o 'Initialize()' da classe de transformação falha ou retorna false. | O código na função Initialize() vem da classe de transformação base especificada na diretiva <#@template#> e dos processadores de diretiva. O erro que causou a falha na inicialização provavelmente está na lista de erros. Investigue por que ela falhou. Você pode examinar o código gerado real para Initialize() seguindo os procedimentos para depurar um modelo. |
O assembly '{0}' para o processador de diretiva '{1}' não recebeu o conjunto de permissões FullTrust. Somente assemblies confiáveis têm permissão para fornecer processadores de diretiva. Esse processador de diretiva não será carregado. | Ocorre quando o sistema não concede permissões FullTrust a um assembly que contém um processador de diretiva. A mensagem fornece o nome do assembly e o nome do processador de diretiva. | Certifique-se de usar apenas assemblies confiáveis no computador local. |
O caminho '{0}' precisa ser local neste computador ou fazer parte de sua zona confiável. | Ocorre quando uma diretiva ou diretiva de assembly faz referência a um arquivo que não está no computador local ou na zona confiável da rede. | Verifique se o diretório em que a diretiva ou as diretivas de assembly estão localizadas está em sua zona confiável. Você pode adicionar um diretório de rede à sua zona confiável por meio do Internet Explorer. |
Vários erros de sintaxe, como "Token inválido 'catch'" ou "Um namespace não pode conter membros diretamente" | Muitas chaves de fechamento no código do modelo. O compilador o está confundindo com o código de geração padrão. | Verifique o número de chaves de fechamento e de colchetes dentro dos delimitadores de código. |
Loops ou condicionais não compilados ou executados corretamente. Por exemplo: <#if (i>10)#> Number is: <#= i #> .Esse código sempre gera o valor de i. Somente "Número é:" é condicional. |
Em C#, sempre use chaves para cercar blocos de texto inseridos em instruções de controle. | Adicionar chaves: <#if (i>10) { #> Number is: <#= i #><# } #> . |
"Expressão muito complexa" ao processar um modelo de tempo de design ou compilar um modelo de runtime (pré-processado). O Visual Studio para de funcionar ao tentar inspecionar o código gerado por um modelo de runtime. |
O bloco de texto é muito longo. T4 converte blocos de texto em uma expressão de concatenação de cadeia de caracteres, com um literal de cadeia de caracteres para cada linha do modelo. Blocos de texto muito longos podem ultrapassar os limites de tamanho do compilador. | Divida o bloco de texto longo com um bloco de expressão, como:<#= "" #> |
Descrições e correções de aviso
A tabela a seguir lista os avisos mais comuns, bem como as correções, se disponíveis.
Mensagem de aviso | Descrição | Solução |
---|---|---|
Carregar o arquivo de inclusão '{0}' retornou uma cadeia de caracteres nula ou vazia. | Ocorrerá se um arquivo de modelo de texto incluído estiver em branco. A mensagem fornece o nome do arquivo incluído. | Remova a diretiva include ou verifique se o arquivo tem conteúdo. |
Compilando uma transformação: | Anexa essa cadeia de caracteres a todos os erros ou avisos provenientes do compilador ao compilar a transformação. Essa cadeia de caracteres significa que o compilador gerou um erro ou aviso. | Se você tiver algum problema para encontrar a DLL, talvez precise fornecer o caminho completo ou um nome forte totalmente qualificado se a DLL estiver no GAC. |
O parâmetro '{0}' já existe na diretiva. O parâmetro duplicado será ignorado. | Ocorre quando um parâmetro é especificado mais de uma vez em uma diretiva. A mensagem fornece o nome do parâmetro e o número de linha da diretiva. | Remova a especificação de parâmetro duplicada. |
Ocorreu um erro ao carregar o arquivo de inclusão '{0}'. A diretiva include será ignorada. | Ocorre quando você não consegue encontrar um arquivo especificado em uma diretiva include . A mensagem fornece o nome do arquivo e o número de linha da diretiva. |
Verifique se o arquivo de inclusão existe no mesmo diretório que o arquivo de modelo de texto original ou em um dos diretórios de inclusão registrados com o host. |
Uma classe base inválida foi especificada para a classe Transformation. A classe base precisa derivar de Microsoft.VisualStudio.TextTemplating.TextTransformation. | Ocorre quando o parâmetro inherits em uma diretiva de modelo especifica uma classe que não herda de TextTransformation . A mensagem fornece o número de linha da diretiva de modelo. |
Especifique uma classe derivada de TextTransformation . |
Uma cultura inválida foi especificada na diretiva 'template'. A cultura precisa estar no formato "xx-XX". A cultura invariável será usada. | Ocorre quando o parâmetro de cultura em uma diretiva de modelo é especificado incorretamente. A mensagem fornece o número de linha da diretiva de modelo. | Altere o parâmetro de cultura para uma cultura válida no formato "xx-XX". |
Um valor de depuração '{0}' inválido foi especificado na diretiva template. O valor de depuração deve ser "true" ou "false". O padrão "false" será usado. | Ocorre quando o parâmetro debug em uma diretiva de modelo é especificado incorretamente. A mensagem fornece o número de linha da diretiva de modelo. |
Defina o parâmetro de depuração como "true" ou "false". |
Um valor de HostSpecific '{0}' inválido foi especificado na diretiva template. O valor HostSpecific deve ser "true" ou "false". O padrão "false" será usado. | Ocorre quando o parâmetro específico do host em uma diretiva template é especificado incorretamente. A mensagem fornece o número de linha da diretiva de modelo. |
Defina o parâmetro específico do host como "true" ou "false". |
Uma linguagem inválida '{0}' foi especificada na diretiva 'template'. A linguagem precisa ser "C#" ou "VB". O valor padrão "C#" será usado. | Ocorre quando uma linguagem sem suporte é especificada na diretiva template . Somente "C#" ou "VB" são permitidos (não diferencia maiúsculas de minúsculas). A mensagem fornece o número de linha da diretiva de modelo. |
Defina o parâmetro language na diretiva de modelo como "C#" ou "VB". |
Várias diretivas de saída foram encontradas no modelo. Todas serão ignoradas, exceto pela primeira. | Ocorre quando várias diretivas output são especificadas em um arquivo de modelo. A mensagem fornece o número de linha da diretiva de saída duplicada. |
Remova diretivas output duplicadas. |
Várias diretivas de modelo foram encontradas no modelo. Todas serão ignoradas, exceto pela primeira. Vários parâmetros para a diretiva de modelo devem ser especificados dentro de uma diretiva de modelo. | Ocorrerá se você especificar várias diretivas template dentro de um arquivo de modelo de texto (incluindo arquivos incluídos). A mensagem fornece o número de linha da diretiva de modelo duplicada. |
Agregue as diferentes diretivas template em uma diretiva template . |
Nenhum processador foi especificado para uma diretiva chamada '{0}'. A diretiva será ignorada. | Ocorrerá se você especificar uma diretiva custom , mas não fornecer um atributo processor . A mensagem fornece o nome da diretiva e o número de linha. |
Forneça um atributo processor com o nome do processador directive para a diretiva. |
Não foi possível encontrar um processador chamado '{0}' para a diretiva chamada '{1}'. A diretiva será ignorada. | Ocorre quando o sistema não consegue localizar o processador directive especificado dentro de uma diretiva custom . A mensagem fornece o nome da diretiva, o nome do processador e o número de linha da diretiva. |
Defina o atributo processor na diretiva como o nome do processador da diretiva. |
Um parâmetro '{0}' obrigatório para a diretiva '{1}' não foi encontrado. A diretiva será ignorada. | Ocorre quando o sistema não fornece um parâmetro de diretiva obrigatório. A mensagem fornece o nome do parâmetro ausente, o nome da diretiva e o número de linha. | Forneça o parâmetro ausente. |
O processador chamado '{0}' não dá suporte à diretiva chamada '{1}'. A diretiva será ignorada. | Ocorre quando um processador de diretiva não dá suporte a uma diretiva. A mensagem fornece o nome e o número de linha da diretiva responsável, juntamente com o nome do processador de diretiva. | Corrija o nome da diretiva. |
A diretiva de inclusão para o arquivo '{0}' causa um loop infinito. | Exibido se diretivas de inclusão circulares forem especificadas (por exemplo, o arquivo A inclui o arquivo B, que inclui o arquivo A). | Não especifique diretivas de inclusão circulares. |
Executando a transformação: | Anexa essa cadeia de caracteres a todos os erros ou avisos gerados durante a execução da transformação. | Não aplicável. |
Uma marca de início ou de fim inesperada foi encontrada dentro de um bloco. Verifique se você não digitou incorretamente uma marca de início ou de fim e se não tem nenhum bloco aninhado no modelo. | Exibido quando você tem um <# ou #> inesperado. Ou seja, se você tiver um <# após outra de marca de abertura que não foi fechada, ou se tiver um #> quando não há uma marca de abertura não fechada antes dela. A mensagem fornece o número de linha da marca incompatível. | Remova a marca de início ou de fim incompatível ou use um caractere de escape. |
Uma diretiva foi especificada no formato errado. A diretiva será ignorada. Especifique a diretiva no formato <#@ name [parametername="parametervalue"]* #> |
Exibido pelo analisador quando uma diretiva não é especificada no formato correto. A mensagem fornece o número de linha da diretiva incorreta. | Verifique se todas as diretivas estão no formato <#@ name [parametername="parametervalue"]* #> . Para saber mais, confira Diretivas de modelo de texto T4. |
Falha ao carregar o Assembly '{0}' para o processador de diretiva registrado '{1}' {2} |
Ocorre quando um processador de diretiva não pôde ser carregado pelo host. A mensagem identifica o assembly fornecido para o processador de diretiva e o nome do processador de diretiva. | Verifique se o processador de diretiva está registrado corretamente e se o assembly existe. |
Falha ao localizar o tipo '{0}' no Assembly '{1}' do processador de diretiva registrado '{2}' {3} |
Ocorre quando um tipo de processador de diretiva não pôde ser carregado de seu assembly. A mensagem fornece o nome do tipo, o assembly e o processador de diretiva. | O vshost localiza informações do processador de diretiva (nome, assembly e tipo) no registro. Verifique se o processador de diretiva está registrado corretamente e se o tipo existe no assembly. |
Ocorreu um problema ao carregar o assembly '{0}' | Ocorre quando há um problema ao carregar um assembly. A mensagem fornece o nome do assembly. | Você pode especificar assemblies a serem carregados em diretivas <@#assembly#> e por processadores de diretiva. A mensagem de erro que segue essa cadeia de caracteres deve fornecer mais dados sobre por que o carregamento do assembly falhou. |
Houve um problema ao criar e inicializar o processador para uma diretiva chamada '{1}'. O tipo do processador é {0}. A diretiva será ignorada. | Ocorre quando o sistema não pôde criar ou inicializar um processador de diretiva. A mensagem fornece o nome e o número de linha da diretiva e o tipo do processador. | Certifique-se de usar o processador de diretiva correto e de que o processador de diretiva tenha um construtor padrão público. Caso contrário, use as opções de depuração para descobrir por que o método Initialize() do processador de diretiva está falhando. Para obter mais informações, consulte Solucionar problemas com modelos de texto. |
Uma Exceção foi gerada durante o processamento de uma diretiva chamada '{0}'. | Ocorre quando um processador de diretiva gera uma exceção ao processar uma diretiva. | Verifique se os parâmetros para o processador de diretiva estão corretos. |
O host gerou uma exceção ao tentar resolver a referência de assembly '{0}'. | Ocorre quando o host gera uma exceção quando tenta resolver uma referência de assembly. A mensagem fornece a cadeia de caracteres de referência do assembly. | As referências do assembly vêm de diretivas <@#assembly#> e de processadores de diretiva. Verifique se o parâmetro 'name' fornecido no parâmetro de assembly está correto. |
Tente especificar o valor '{0}' sem suporte {1} para a diretiva {2} | Ocorre pelo RequiresProvidesDirectiveProcessor (todos os nossos processadores de diretiva gerados derivam dele), quando você fornece um argumento requires ou provides sem suporte. | Verifique se os nomes nos pares nome='valor' fornecidos nos parâmetros requires e provides estão corretos. |