Partilhar via


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 do modelo. Diferentes tipos de erros podem ocorrer dentro de cada etapa. Os passos são os seguintes.

Step Modelo em tempo de design: quando acontece Modelo de tempo de execução: quando ocorre
O código é gerado a partir do modelo de texto.

Erros nas diretivas, ou tags 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.
Imediatamente após a etapa anterior. Junto com o código do seu aplicativo.
O código é executado.

Erros em tempo de execução no código do modelo.
Imediatamente após a etapa anterior. Quando seu 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 usual é 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 suas correções.

Mensagem de erro Description Solução
Falha ao carregar a classe base '{0}' da qual a classe Transformation herda. Ocorre se você não conseguir encontrar a inherits classe base especificada no parâmetro em uma diretiva de modelo. A mensagem fornece o número da linha da diretiva de modelo. Certifique-se de que a classe especificada existe e que a assembly em que se encontra está especificada numa diretiva de assembly.
Falha ao resolver incluir texto para o arquivo:{0} Ocorre quando você não consegue encontrar um modelo incluído. A mensagem fornece o nome do arquivo de inclusão solicitado. Certifique-se de que o caminho do arquivo é relativo ao caminho do modelo original, ou que o arquivo está em um local registrado com o host, ou que há um caminho completo para o arquivo.
Foram gerados erros ao inicializar o objeto de transformação. A transformação não será executada. Ocorre quando o 'Initialize()' da classe de transformação falhou ou retornou false. O código na função Initialize() vem da classe de transformação base especificada na <diretiva #@template#> e de processadores de diretiva. O erro que causou a falha na inicialização provavelmente está na lista de erros. Investigue por que falhou. Você pode examinar o código gerado real para Initialize() seguindo os procedimentos para depurar um modelo.
O assembly '{0}' para processador de diretriz '{1}' não recebeu o conjunto de permissões FullTrust. Somente assemblies confiáveis têm permissão para fornecer processadores de diretrizes. Este 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 diretrizes. A mensagem fornece o nome do assembly e o nome do processador de diretrizes. Certifique-se de usar apenas conjuntos confiáveis na máquina local.
O caminho '{0}' deve ser local para este computador ou parte da sua zona confiável. Ocorre quando uma diretiva ou diretiva de assembly faz referência a um arquivo que não está na máquina local ou na zona confiável da rede. Certifique-se de que o diretório onde as diretivas ou diretrizes de assembly estão localizadas está na sua zona de confiança. Pode adicionar um diretório de rede à sua zona fidedigna através do Internet Explorer.
Vários erros de sintaxe, como "Token inválido 'catch'" ou "Um namespace não pode conter diretamente membros" Muitas chaves de fechamento no código do modelo. O compilador está confundindo-o com o código de geração padrão. Verifique o número de chaves de fecho e colchetes de fecho dentro dos delimitadores de código.
Laços ou condicionais não são compilados nem executados corretamente. Por exemplo: <#if (i>10)#> Number is: <#= i #>.

Esse código sempre gera o valor de i. Apenas "Número é:" é condicional.
Em C#, sempre use chaves para cercar blocos de texto incorporados em instruções de controle. Adicione chaves: <#if (i>10) { #> Number is: <#= i #><# } #>.
"Expressão demasiado complexa" ao processar um modelo de tempo de conceção ou compilar um modelo de tempo de execução (pré-processado).

Visual Studio para de funcionar ao tentar inspecionar o código gerado por um modelo de tempo de execução.
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 de 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 alertas

A tabela a seguir lista os avisos mais comuns, juntamente com correções, se disponíveis.

Mensagem de Aviso Description Solução
Carregar o arquivo de inclusão '{0}' retornou uma cadeia de caracteres nula ou vazia. Ocorre 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 certifique-se de que o arquivo tenha algum conteúdo.
Compilando a transformação: Prefixe esta cadeia de caracteres a todos os erros ou avisos provenientes do compilador quando este compila a transformação. Essa cadeia de caracteres significa que o compilador lançou um erro ou aviso. Se você tiver um problema para encontrar a DLL, talvez seja necessário 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 da linha da diretiva. Remova a especificação de parâmetro duplicado.
Ocorreu um erro ao carregar o ficheiro de inclusão '{0}'. A diretiva de inclusão será ignorada. Ocorre quando você não consegue encontrar um arquivo especificado em uma include diretiva. A mensagem fornece o nome do arquivo e o número da linha da diretiva. Verifique se o arquivo include existe no mesmo diretório que o arquivo de modelo de texto original ou em um dos diretórios include registrados no host.
Uma classe base inválida foi especificada para a classe Transformation. A classe base deve derivar de Microsoft.VisualStudio.TextTemplating.TextTransformation. Ocorre quando o inherits parâmetro em uma diretiva de modelo especifica uma classe que não herda de TextTransformation. A mensagem fornece o número da linha da diretiva de modelo. Especifique uma classe que deriva de TextTransformation.
Uma cultura inválida foi especificada na diretiva «modelo». A cultura deve estar no formato "xx-XX". Será utilizada a cultura invariante. Ocorre quando o parâmetro culture em uma diretiva de modelo é especificado incorretamente. A mensagem fornece o número da linha da diretiva de modelo. Altere o parâmetro culture para uma cultura válida no formato "xx-XX".
Um valor de depuração inválido '{0}' foi especificado na diretiva de modelo. O valor de depuração deve ser "verdadeiro" ou "falso". O valor padrão "false" será usado. Ocorre quando o debug parâmetro em uma diretiva de modelo é especificado incorretamente. A mensagem fornece o número da linha da diretiva de modelo. Defina o parâmetro debug como "true" ou "false".
Um valor HostSpecific inválido '{0}' foi especificado na diretiva de modelo. O valor HostSpecific deve ser "true" ou "false". O valor de predefinição "false" será aplicado. Ocorre quando o parâmetro específico do host em uma template diretiva é especificado incorretamente. A mensagem fornece o número da 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 deve ser "C#" ou "VB". O valor padrão de "C#" será usado. Ocorre quando um idioma sem suporte é especificado na template diretiva. Apenas "C#" ou "VB" são permitidos (sem distinção de maiúsculas). A mensagem fornece o número da linha da diretiva de modelo. Defina o language parâmetro na diretiva de modelo como "C#" ou "VB".
Várias diretivas de saída foram encontradas no modelo. Todos, exceto o primeiro, serão ignorados. Ocorre quando várias output diretivas são especificadas em um arquivo de modelo. A mensagem fornece o número da linha da diretiva de saída duplicada. Remova diretivas duplicadas output .
Várias diretivas de modelo foram encontradas no modelo. Todos, exceto o primeiro, serão ignorados. Vários parâmetros para a diretiva modelo devem ser especificados dentro de uma diretiva-modelo. Ocorre se você especificar várias template diretivas em um arquivo de modelo de texto (incluindo arquivos incluídos). A mensagem fornece o número da linha da diretiva de modelo duplicado. Agregar as diferentes template diretivas numa única template diretiva.
Nenhum processador foi especificado para uma diretiva chamada '{0}'. A diretiva será ignorada. Ocorre se você especificar uma custom diretiva, mas não fornecer um processor atributo. A mensagem fornece o nome da diretiva e o número da linha. Forneça um atributo processor que contenha o nome do processador directive para a diretiva.
Não foi possível encontrar um processador chamado '{0}' para a diretiva denominada '{1}'. A diretiva será ignorada. Ocorre quando o sistema não consegue encontrar o directive processador especificado em uma custom diretiva. A mensagem fornece o nome da diretiva, o nome do processador e o número da linha da diretiva. Defina o processor atributo na diretiva como o nome do processador de diretrizes.
Não foi encontrado um parâmetro obrigatório '{0}' para a diretiva '{1}'. A diretiva será ignorada. Ocorre quando o sistema não fornece um parâmetro de diretiva necessário. A mensagem fornece o nome do parâmetro ausente, o nome da diretiva e o número da linha. Introduza o parâmetro em falta.
O processador chamado '{0}' não suporta a diretiva chamada '{1}'. A diretiva será ignorada. Ocorre quando um processador de diretriz não oferece suporte a uma diretiva. A mensagem fornece o nome e o número da linha da diretiva infratora, juntamente com o nome do processador de diretrizes. Corrigir o nome da diretiva.
A diretiva include para o arquivo '{0}' causa um loop infinito. Exibido quando são especificadas diretivas de inclusão circular (por exemplo, o arquivo A inclui o arquivo B, que por sua vez inclui o arquivo A). Não especifique diretivas circulares de inclusão.
Executando a transformação: Antepõe esta 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 fim inesperada foi encontrada dentro de um bloco. Certifique-se de que não escreveu incorretamente uma etiqueta de início ou fim e de que não tem nenhum bloco aninhado no template. Exibido quando tens um # inesperado < ou #>. Ou seja, se você tem um <# após outra tag aberta que não foi fechada, ou se você tem um #> quando não há nenhuma tag aberta não fechada antes dela. A mensagem fornece o número da linha da tag incompatível. Remova a etiqueta de início ou fim incompatível ou utilize um caractere de escape.
Foi especificada uma diretiva no formato errado. A diretiva será ignorada. Especificar a diretiva no formato <#@ name [parametername="parametervalue"]* #> Exibido pelo analisador se uma diretiva não for especificada no formato correto. A mensagem fornece o número da linha da diretiva incorreta. Certifique-se de que todas as diretivas estão na forma <#@ name [parametername="parametervalue"]* #>. Para obter mais informações, consulte T4 Text Template Directives.
Falha ao carregar Assembly '{0}' para o processador de diretiva registado '{1}'

{2}
Ocorre quando um processador de diretriz não pôde ser carregado pelo host. A mensagem identifica o assembly fornecido ao processador de diretivas e o nome do processador de diretivas. Verifique se o processador de diretriz está registrado corretamente e se o assembly existe.
Falha ao encontrar o tipo '{0}' no Assembly '{1}' para o processador de diretriz 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, conjuntura e processador de diretivas. O Vshost localiza informações do processador de diretivas (nome, assembly e tipo) no Registro. Verifique se o processador de diretiva está registado corretamente e se o tipo existe na assembly.
Houve um problema ao carregar a montagem '{0}' Ocorre quando há um problema no carregamento de um assembly. A mensagem fornece o nome do assembly. Você pode especificar assemblies a serem carregados em <diretivas @#assembly#> e por processadores de diretrizes. 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 de processador é {0}. A diretiva será ignorada. Ocorre quando o sistema não pôde criar ou inicializar um processador de diretrizes. A mensagem fornece o nome e o número da linha da diretiva e o tipo do processador. Certifique-se de usar o processador de diretriz correto e que o processador de diretriz 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 Solução de problemas de modelos de texto.
Uma exceção foi lançada durante o processamento de uma diretiva chamada '{0}'. Ocorre quando um processador de diretriz lança uma exceção ao processar uma diretiva. Certifique-se de que os parâmetros para o processador de diretriz estão corretos.
O host lançou uma exceção ao tentar resolver a referência de assembly '{0}'. Ocorre quando o host lança uma exceção ao tentar resolver uma referência de assembly. A mensagem fornece a cadeia de caracteres de referência de assembly. As referências de assembly vêm de <diretivas @#assembly#> e de processadores de diretrizes. Certifique-se de que o parâmetro 'name' fornecido no parâmetro assembly está correto.
Tentativa de especificar um valor {1} não suportado '{0}' para a diretiva {2} Ocorre pelo RequiresProvidesDirectiveProcessor (todos os nossos processadores de diretiva gerados derivam dele), quando você fornece um argumento não suportado requer ou fornece. Certifique-se de que os nomes nos pares name='value' fornecidos nos parâmetros requires e provides estão corretos.