Passo a passo: Conectando a um Host para um processador de diretiva gerados
Você pode escrever seu próprio host que processa os modelos de texto.Um host personalizado básico é demonstrado em Passo a passo: Criando um Host de modelo de texto personalizado.Você pode estender esse host para adicionar funções, como gerar vários arquivos de saída.
Esta explicação passo a passo, você expandir seu host personalizado para que ele oferece suporte a modelos de texto que chamam os processadores de diretriz.Quando você define uma linguagem específica de domínio, ele gera uma processador de diretriz para o modelo de domínio.Processador de diretriz torna mais fácil para os usuários escrevam modelos que acessar o modelo, reduzindo a necessidade de escrever o assembly e importar diretivas nos modelos.
Cuidado |
---|
Esta explicação passo a passo baseia-se na Passo a passo: Criando um Host de modelo de texto personalizado.Execute esse passo a passo pela primeira vez. |
Esta explicação passo a passo inclui as seguintes tarefas:
Usando Ferramentas de Linguagem Específica do Domínio para gerar um processador de diretriz que se baseia em um modelo de domínio.
Conectando-se um host de modelo de texto personalizado para o processador de diretriz gerado.
Testando o host personalizado com o processador de diretriz gerado.
Pré-requisitos
Para definir uma DSL, você deve ter instalado os seguintes componentes:
Visual Studio |
|
SDK do Visual Studio |
|
SDK de modelagem e visualização de Visual Studio |
Além disso, você deve ter a transformação do modelo de texto personalizado criada em Passo a passo: Criando um Host de modelo de texto personalizado.
Usando ferramentas de linguagem específica de domínio para gerar um processador de diretiva
Esta explicação passo a passo, você pode usar 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.
Usar ferramentas de linguagem específica de domínio para gerar um processador de diretriz que se baseia em um modelo de domínio
Crie uma solução de linguagem específica de domínio que tem as seguintes características:
Nome: DSLMinimalTest
Modelo de solução: mínimo de idioma
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, consulte Como: criar uma solução de linguagem específica do domínio.
Sobre o Build menu, clique em Build Solution.
Importante Esta etapa gera o processador de diretriz e adiciona a chave para ele no registro.
No menu Depuração, clique em Iniciar Depuração.
Uma segunda instância do Visual Studio abre.
Na compilação experimental, em Solution Explorer, duas vezes no arquivo sample.min.
O arquivo é aberto no designer.Observe que o modelo possui dois elementos, ExampleElement1 e ExampleElement2 e um link entre eles.
Feche a segunda instância de Visual Studio.
Salve a solução e, em seguida, feche o Designer de linguagem específica de domínio.
Conectando a um Host de modelo de texto personalizado para um processador de diretiva
Depois de gerar o processador de diretriz, conecte o processador de diretriz e o host de modelo de texto personalizado que você criou na Passo a passo: Criando um Host de modelo de texto personalizado.
Para se conectar a um host de modelo de texto personalizado para o processador de diretriz gerado
Abra a solução de CustomHost.
No menu Project, escolha Add Reference.
O Add Reference caixa de diálogo é aberta com o .NET guia 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 do Program. cs ou Module1. vb, adicione a seguinte linha de código:
using Microsoft.Win32;
Imports Microsoft.Win32
Localize o código para a propriedade StandardAssemblyReferencese substituí-lo com o seguinte código:
Observação Nesta etapa, você pode adicionar referências aos assemblies que são necessários para o processador de diretriz gerado que suportará o seu host.
//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 para a função ResolveDirectiveProcessore substituí-lo com o seguinte código:
Importante Esse código contém referências embutido para o nome do processador de diretriz gerado para o qual você deseja se conectar.Você pode facilmente fazer isso mais geral, caso em que ele procura todos os processadores de diretriz listados no registro e tenta encontrar uma correspondência.Nesse caso, o host funcionaria com qualquer processador de diretriz 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 File, clique em Save All.
Sobre o Build menu, clique em Build Solution.
Testando o Host personalizado com o processador de diretiva
Para testar o host do modelo de texto personalizado, primeiro você deve escrever um modelo de texto que chama o processador de diretriz gerado.Em seguida, você executa o host personalizado, passa para ele o nome do modelo de texto e verificar que a diretiva seja processada corretamente.
Para criar um modelo de texto para testar o host personalizado
Crie um arquivo de texto e o nome de TestTemplateWithDP.tt.Você pode usar qualquer editor de texto, como o bloco de notas, para criar o arquivo.
Adicione o seguinte para o arquivo de texto:
Observação A linguagem de programação do modelo de texto não precisa coincidir com o 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(""); } #>
Text Template Host Test <#@ template debug="true" language="VB" 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 #> <# For Each box as ExampleElement In Me.ExampleModel.Elements WriteLine("Box: {0}", box.Name) For Each LinkedTo as ExampleElement In box.Targets WriteLine("Linked to: {0}", LinkedTo.Name) Next For Each LinkedFrom as ExampleElement In box.Sources WriteLine("Linked from: {0}", LinkedFrom.Name) Next WriteLine("") Next #>
No código, substitua < caminho > com o caminho do arquivo Sample.min do idioma específico do design 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, você pode procurar o arquivo CustomHost.exe na Windows Explorere, em seguida, 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, você pode procurar o arquivo TestTemplateWithDP.txt na Windows Explorere, em seguida, arraste o arquivo para a janela do Prompt de comando.
O aplicativo host personalizado é executado e inicia o processo de transformação do modelo de texto.
Em Windows Explorer, navegue até a pasta que contém o arquivo TestTemplateWithDP.txt.
A pasta também contém o arquivo TestTemplateWithDP1.txt.
Abra este arquivo para ver os resultados da transformação do modelo de texto.
Os resultados da saída de texto gerado é exibido e deve ficar assim:
Text Template Host Test Box: ExampleElement1 Linked to: ExampleElement2 Box: ExampleElement2 Linked from: ExampleElement1
Consulte também
Tarefas
Passo a passo: Criando um Host de modelo de texto personalizado