Compartilhar 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 em cada etapa. As etapas são as seguintes.

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

Erros em 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 aplicativo.
O código é executado.

Erros em tempo de execução no código do template.
Imediatamente 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 dados 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. Ocorrerá se você não encontrar a classe base especificada no inherits parâmetro 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 no qual ela existe está especificado em uma diretiva de assembly.
Não foi possível resolver a inclusão de 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. 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 falhou ou retornou 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 da 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 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. 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 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}' deve ser local para este computador ou parte da 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 as diretivas de diretório ou 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 de forma direta" Muitos colchetes de fechamento no código do template. O compilador está confundindo-o com o código de geração padrão. Verifique o número de chaves de fechamento e colchetes dentro de delimitadores de código.
Loops ou condicionais não compilados ou executados incorretamente. 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 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 dos avisos e correções

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

Mensagem de aviso Description Solução
O carregamento do 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 verifique se o arquivo tem algum conteúdo.
Transformação de compilação: Anexa essa cadeia de caracteres a todos os erros ou avisos provenientes do compilador quando ele compila a transformação. Essa cadeia de caracteres significa que o compilador lançou um erro ou aviso. Se você tiver um problema ao 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 de linha da diretiva. Remova a especificação de parâmetro duplicado.
Erro ao carregar o arquivo 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 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 deve 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 que deriva de TextTransformation.
Uma cultura inválida foi especificada na diretiva 'template'. A cultura deve 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 inválido '{0}' foi especificado na diretiva de modelo. O valor de debug deve ser "true" ou "false". O padrão de "false" será usado. Ocorre quando o debug parâmetro 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 HostSpecific inválido '{0}' foi especificado na diretiva de modelo. O valor HostSpecific deve ser "true" ou "false". O padrão de "false" será usado. Ocorre quando o parâmetro específico do host em uma template diretiva é 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".
Um idioma inválido '{0}' foi especificado na diretiva 'template'. O idioma deve ser "C#" ou "VB". O valor padrão de "C#" será usado. Ocorre quando um idioma sem suporte é especificado na template diretiva. 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 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 de 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 de modelo devem ser especificados em uma diretiva de 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 de linha da diretiva de modelo duplicada. Agregue as diferentes template diretivas em uma 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 processor atributo com o nome do directive processador 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 encontrar o directive processador especificado dentro de uma custom diretiva. A mensagem fornece o nome da diretiva, o nome do processador e o número de linha da diretiva. Defina o processor atributo na diretiva como o nome do processador de diretiva.
Um parâmetro necessário '{0}' para a diretiva '{1}' não foi encontrado. 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. 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 ofensiva, juntamente com o nome do processador de diretivas. Corrija o nome da diretiva.
A diretiva include para o arquivo '{0}' causa um loop infinito. Exibido se as diretivas de inclusão circular forem especificadas (por exemplo, o arquivo A inclui o arquivo B, que inclui o arquivo A). Não especifique diretivas circulares de inclusão.
Transformação em execuçã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 etiqueta de abertura ou fechamento inesperada foi encontrada dentro de um bloco. Verifique se você não digitou incorretamente uma tag de início ou de término e que não tem blocos aninhados no template. Exibido quando você tem um <# ou #> inesperado. Ou seja, se você tiver um <# após outra tag aberta que não tenha sido fechada, ou tiver um #> quando não houver nenhuma tag aberta não fechada antes dela. A mensagem fornece o número de linha da marca incompatível. Remova a marca inicial ou final 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 se uma diretiva não for especificada no formato correto. A mensagem fornece o número de linha da diretiva incorreta. Verifique se todas as diretivas estão no formulário <#@ name [parametername="parametervalue"]* #>. Para obter mais informações, consulte 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}' para o processador de diretivas registrado '{2}'

{3}
Ocorre quando um tipo de processador de diretiva não pôde ser carregado de seu assembly do .NET. A mensagem fornece o nome do tipo, assembly e processador de diretiva. O vshost localiza informações do processador de diretivas (nome, assembly e tipo) no Registro do Windows. Verifique se o processador de diretiva está registrado corretamente e se o tipo existe no assembly.
Houve um problema ao carregar o assembly '{0}' Ocorre quando há um problema ao carregar um assembly. A mensagem fornece o nome do componente (assembly). Você pode especificar assemblies a serem carregados em diretivas <@#assembly#> e por processadores de diretivas. A mensagem de erro que segue essa cadeia de caracteres deve fornecer mais dados sobre por que a carga 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 se o processador de diretivas tem 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 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 lançou 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 de assembly vêm de diretivas <@#assembly#> e processadores de diretivas. Verifique se o parâmetro 'name' fornecido no parâmetro assembly está correto.
Tentativa de especificar um valor sem suporte {1} '{0}' para a diretiva {2} Ocorre pelo RequiresProvidesDirectiveProcessor (do qual todos os nossos processadores de diretiva gerados derivam), quando você fornece um argumento "requires" ou "provides" que não é suportado. Certifique-se de que os nomes nos pares name='value' fornecidos nos parâmetros requeridos e fornecidos estão corretos.