Passo a passo: conectar um host a um processador de diretiva gerado
Você pode escrever seu host que processa modelos de texto. Um host personalizado básico é demonstrado em Passo a passo: Criar um host de modelo de texto personalizado. Você pode estender esse host para adicionar funções, como gerar vários arquivos de saída.
Neste passo a passo, você expande seu host personalizado para que ele dê suporte a modelos de texto que chamam processadores de diretiva. Quando você define uma linguagem específica de domínio, ela gera um processador de diretiva para o modelo de domínio. O processador de diretiva torna mais fácil para os usuários escrever modelos que acessam o modelo, reduzindo a necessidade de escrever diretivas de assembly e de importação nos modelos.
Observação
Este passo a passo se baseia em Passo a passo: criar um host de modelo de texto personalizado. Execute esse passo a passo primeiro.
Esta explicação passo a passo inclui as seguintes tarefas:
Usar Ferramentas de Linguagem Específica de Domínio para gerar um processador de diretiva baseado em um modelo de domínio.
Como conectar um host de modelo de texto personalizado ao processador de diretiva gerado.
Testar o host personalizado com o processador de diretiva gerado.
Pré-requisitos
Para definir uma DSL, é necessário ter instalados os seguintes componentes:
Componente | Link |
---|---|
Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185579 |
SDK do Visual Studio | http://go.microsoft.com/fwlink/?LinkId=185580 |
SDK de Visualização e Modelagem do Visual Studio |
Observação
O componente Transformação de Modelo de Texto é instalado automaticamente como parte da carga de trabalho de Desenvolvimento de extensões do Visual Studio. Você também pode instalá-lo na guia Componentes individuais do Instalador do Visual Studio, na categoria SDKs, bibliotecas e estruturas. Instale o componente SDK de Modelagem na guia Componentes individuais.
Além disso, você precisa ter a transformação de modelo de texto personalizado criada em Passo a passo: criar um host de modelo de texto personalizado.
Usar Ferramentas de Linguagem Específica de Domínio para gerar um processador de diretiva
Neste passo a passo, você usa o Assistente de Designer de Linguagem Específica de Domínio para criar uma linguagem específica de domínio para a solução DSLMinimalTest.
Crie uma solução de linguagem específica de domínio que tenha as seguintes características:
Nome: DSLMinimalTest
Modelo de solução: linguagem mínima
Extensão de arquivo: min
Nome da empresa: Fabrikam
Para obter mais informações sobre como criar uma solução de linguagem específica de domínio, confira Como criar uma solução de linguagem específica de domínio.
No menu Compilar, clique em Compilar Solução.
Importante
Esta etapa gera o processador de diretiva e adiciona a chave para ele no Registro.
No menu Depurar , clique em Iniciar Depuração.
Uma segunda instância do Visual Studio é aberta.
No build experimental, em Gerenciador de Soluções, clique duas vezes no arquivo sample.min.
O arquivo é aberto no designer. Observe que o modelo tem dois elementos, ExampleElement1 e ExampleElement2, e um link entre eles.
Feche a segunda instância do Visual Studio.
Salve a solução e feche o Designer de Linguagem Específica de Domínio.
Conectar um host de modelo de texto personalizado a um processador de diretiva
Depois de gerar o processador de diretiva, conecte o processador de diretiva e o host de modelo de texto personalizado que você criou em Passo a passo: criar um host de modelo de texto personalizado.
Abra a solução CustomHost.
No menu Projeto, clique em Adicionar Referência.
A caixa de diálogo Adicionar Referência é aberta com a guia .NET exibida.
Adicione as seguintes referências:
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0
Microsoft.VisualStudio.TextTemplating.11.0
Microsoft.VisualStudio.TextTemplating.Interfaces.11.0
Microsoft.VisualStudio.TextTemplating.Modeling.11.0
Microsoft.VisualStudio.TextTemplating.VSHost.11.0
Na parte superior de Program.cs ou Module1.vb, adicione a seguinte linha de código:
Localize o código da propriedade
StandardAssemblyReferences
e substitua-o pelo seguinte código:Observação
Nesta etapa, você adicionará referências aos assemblies exigidos pelo processador de diretiva gerado ao qual o host dará suporte.
//the host can provide standard assembly references //the engine will use these references when compiling and //executing the generated transformation class //-------------------------------------------------------------- public IList<string> StandardAssemblyReferences { get { return new string[] { //if this host searches standard paths and the GAC //we can specify the assembly name like this: //"System" //since this host only resolves assemblies from the //fully qualified path and name of the assembly //this is a quick way to get the code to give us the //fully qualified path and name of the System assembly //--------------------------------------------------------- typeof(System.Uri).Assembly.Location, typeof(System.Uri).Assembly.Location, typeof(Microsoft.VisualStudio.Modeling.ModelElement).Assembly.Location, typeof(Microsoft.VisualStudio.Modeling.Diagrams.BinaryLinkShape).Assembly.Location, typeof(Microsoft.VisualStudio.TextTemplating.VSHost.ITextTemplating).Assembly.Location, typeof(Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation).Assembly.Location }; } }
Localize o código da função
ResolveDirectiveProcessor
e substitua-o pelo seguinte código:Importante
Esse código contém referências embutidas em código para o nome do processador de diretiva gerado ao qual você deseja se conectar. Você pode facilmente tornar isso mais geral; nesse caso, ele procura todos os processadores de diretiva listados no registro e tenta encontrar uma correspondência. Nesse caso, o host funcionaria com qualquer processador de diretiva gerado.
//the engine calls this method based on the directives the user has //specified it in the text template //this method can be called 0, 1, or more times //--------------------------------------------------------------------- public Type ResolveDirectiveProcessor(string processorName) { //check the processor name, and if it is the name of the processor the //host wants to support, return the type of the processor //--------------------------------------------------------------------- if (string.Compare(processorName, "DSLMinimalTestDirectiveProcessor", StringComparison.InvariantCultureIgnoreCase) == 0) { try { string keyName = @"Software\Microsoft\VisualStudio\10.0Exp_Config\TextTemplating\DirectiveProcessors\DSLMinimalTestDirectiveProcessor"; using (RegistryKey specificKey = Registry.CurrentUser.OpenSubKey(keyName)) { if (specificKey != null) { List<string> names = new List<String>(specificKey.GetValueNames()); string classValue = specificKey.GetValue("Class") as string; if (!string.IsNullOrEmpty(classValue)) { string loadValue = string.Empty; System.Reflection.Assembly processorAssembly = null; if (names.Contains("Assembly")) { loadValue = specificKey.GetValue("Assembly") as string; if (!string.IsNullOrEmpty(loadValue)) { //the assembly must be installed in the GAC processorAssembly = System.Reflection.Assembly.Load(loadValue); } } else if (names.Contains("CodeBase")) { loadValue = specificKey.GetValue("CodeBase") as string; if (!string.IsNullOrEmpty(loadValue)) { //loading local assembly processorAssembly = System.Reflection.Assembly.LoadFrom(loadValue); } } if (processorAssembly == null) { throw new Exception("Directive Processor not found"); } Type processorType = processorAssembly.GetType(classValue); if (processorType == null) { throw new Exception("Directive Processor not found"); } return processorType; } } } } catch (Exception e) { //if the directive processor can not be found, throw an error throw new Exception("Directive Processor not found"); } } //if the directive processor is not one this host wants to support throw new Exception("Directive Processor not supported"); }
No menu Arquivo , clique em Salvar Tudo.
No menu Compilar, clique em Compilar Solução.
Testar o host personalizado com o processador de diretiva
Para testar o host de modelo de texto personalizado, primeiro você precisa escrever um modelo de texto que chame o processador de diretiva gerado. Em seguida, execute o host personalizado, passe para ele o nome do modelo de texto e verifique se a diretiva foi processada corretamente.
Criar um modelo de texto para testar o host personalizado
Crie um arquivo de texto e nomeie-o
TestTemplateWithDP.tt
. Você pode usar qualquer editor de texto (por exemplo, o Bloco de Notas) para criar o arquivo.Adicione o seguinte ao arquivo de texto:
Observação
A linguagem de programação do modelo de texto não precisa corresponder à linguagem do host personalizado.
Text Template Host Test <#@ template debug="true" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #> <# //this is the call to the examplemodel directive in the generated directive processor #> <#@ DSLMinimalTest processor="DSLMinimalTestDirectiveProcessor" requires="fileName='<Your Path>\Sample.min'" provides="ExampleModel=ExampleModel" #> <# //uncomment this line to test that the host allows the engine to set the extension #> <# //@ output extension=".htm" #> <# //uncomment this line if you want to see the generated transformation class #> <# //System.Diagnostics.Debugger.Break(); #> <# //this code uses the results of the examplemodel directive #> <# foreach ( ExampleElement box in this.ExampleModel.Elements ) { WriteLine("Box: {0}", box.Name); foreach (ExampleElement linkedTo in box.Targets) { WriteLine("Linked to: {0}", linkedTo.Name); } foreach (ExampleElement linkedFrom in box.Sources) { WriteLine("Linked from: {0}", linkedFrom.Name); } WriteLine(""); } #>
No código, substitua <SEU CAMINHO> pelo caminho do arquivo Sample.min da linguagem específica de domínio que você criou no primeiro procedimento.
Salve e feche o arquivo.
Para testar o host personalizado
Abra uma janela de Prompt de Comando.
Digite o caminho do arquivo executável para o host personalizado, mas não pressione ENTER ainda.
Por exemplo, digite:
<YOUR PATH>CustomHost\bin\Debug\CustomHost.exe
Observação
Em vez de digitar o endereço, procure o arquivo CustomHost.exe no Windows Explorer e depois arraste o arquivo para a janela do Prompt de Comando.
Digite um espaço.
Digite o caminho do arquivo de modelo de texto e pressione ENTER.
Por exemplo, digite:
<YOUR PATH>TestTemplateWithDP.txt
Observação
Em vez de digitar o endereço, procure o arquivo TestTemplateWithDP.txt no Windows Explorer e depois arraste o arquivo para a janela Prompt de Comando.
O aplicativo host personalizado é executado e inicia o processo de transformação do modelo de texto.
No Windows Explorer, navegue até a pasta que contém o arquivo TestTemplateWithDP.txt.
A pasta também contém o arquivo TestTemplateWithDP1.txt.
Abra esse arquivo para ver os resultados da transformação do modelo de texto.
Os resultados da saída de texto gerada são exibidos e devem ter esta aparência:
Text Template Host Test Box: ExampleElement1 Linked to: ExampleElement2 Box: ExampleElement2 Linked from: ExampleElement1