Sdílet prostřednictvím


Návod: Připojení hostitele k procesoru vygenerovaných direktiv

Můžete napsat vlastního hostitele, který zpracovává textové šablony. Základní vlastní hostitel je ukázaný v návodu: Vytvoření vlastního hostitele textové šablony. Tento hostitel můžete rozšířit o přidání funkcí, jako je generování více výstupních souborů.

V tomto názorném postupu rozbalíte vlastního hostitele tak, aby podporoval textové šablony, které volají procesory direktiv. Když definujete jazyk specifický pro doménu, vygeneruje procesor direktiv pro doménový model. Procesor direktiv usnadňuje uživatelům psaní šablon, které přistupujících k modelu, což snižuje potřebu psát direktivy sestavení a importu do šablon.

Poznámka:

Tento názorný postup vychází z návodu: Vytvoření vlastního hostitele textových šablon. Nejprve proveďte tento názorný postup.

Tento návod zahrnuje následující úlohy:

  • Použití jazykových nástrojů specifických pro doménu k vygenerování procesoru direktiv založeného na doménovém modelu.

  • Připojení hostitele vlastní textové šablony do vygenerovaného procesoru direktiv.

  • Testování vlastního hostitele pomocí vygenerovaného procesoru direktiv

Požadavky

Chcete-li definovat DSL, musíte mít nainstalované následující součásti:

Komponenta Odkaz
Visual Studio http://go.microsoft.com/fwlink/?LinkId=185579
Visual Studio SDK http://go.microsoft.com/fwlink/?LinkId=185580
Visual Studio Visualization and Modeling SDK

Poznámka:

Komponenta Transformace textové šablony se automaticky nainstaluje jako součást sady funkcí vývoje rozšíření sady Visual Studio. Můžete ho také nainstalovat z karty Jednotlivé komponenty Instalační program pro Visual Studio v kategorii sad SDK, knihoven a architektur. Nainstalujte komponentu Modeling SDK z karty Jednotlivé komponenty .

Kromě toho musíte mít vytvořenou transformaci vlastní textové šablony v návodu: Vytvoření vlastního hostitele textové šablony.

Použití jazykových nástrojů specifických pro doménu k vygenerování procesoru direktiv

V tomto názorném postupu použijete Průvodce návrhářem jazyka specifický pro doménu k vytvoření jazyka specifického pro doménu pro řešení DSLMinimalTest.

  1. Vytvořte jazykové řešení specifické pro doménu, které má následující charakteristiky:

    • Název: DSLMinimalTest

    • Šablona řešení: Minimální jazyk

    • Přípona souboru: min

    • Název společnosti: Fabrikam

    Další informace o vytvoření jazykového řešení specifického pro doménu najdete v tématu Postupy: Vytvoření jazykového řešení specifického pro doménu.

  2. V nabídce Sestavení klikněte na Sestavit řešení.

    Důležité

    Tento krok vygeneruje procesor direktiv a přidá klíč pro něj v registru.

  3. V nabídce Ladit klikněte na Spustit ladění.

    Otevře se druhá instance sady Visual Studio.

  4. V experimentálním buildu v Průzkumník řešení poklikejte na soubor sample.min.

    Soubor se otevře v návrháři. Všimněte si, že model má dva prvky, ExampleElement1 a ExampleElement2 a propojení mezi nimi.

  5. Zavřete druhou instanci sady Visual Studio.

  6. Uložte řešení a zavřete Návrhář jazyka specifický pro doménu.

Připojení vlastního hostitele textové šablony na procesor direktiv

Po vygenerování procesoru direktiv připojíte procesor direktiv a hostitele vlastní textové šablony, kterého jste vytvořili v návodu: Vytvoření vlastního hostitele textové šablony.

  1. Otevřete řešení CustomHost.

  2. V nabídce Projekt klepněte na tlačítko Přidat odkaz.

    Otevře se dialogové okno Přidat odkaz s zobrazenou kartou .NET .

  3. Přidejte následující odkazy:

    • 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

  4. V horní části souboru Program.cs nebo Module1.vb přidejte následující řádek kódu:

    using Microsoft.Win32;
    
  5. Vyhledejte kód vlastnosti StandardAssemblyReferencesa nahraďte ho následujícím kódem:

    Poznámka:

    V tomto kroku přidáte odkazy na sestavení vyžadovaná vygenerovaným procesorem direktiv, který bude váš hostitel podporovat.

    //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
    
            };
        }
    }
    
  6. Vyhledejte kód funkce ResolveDirectiveProcessora nahraďte ho následujícím kódem:

    Důležité

    Tento kód obsahuje pevně zakódované odkazy na název vygenerovaného procesoru direktiv, ke kterému se chcete připojit. Tento postup můžete snadno zobecnit, v takovém případě hledá všechny procesory direktiv uvedené v registru a pokusí se najít shodu. V takovém případě by hostitel fungoval s jakýmkoli vygenerovaným procesorem direktiv.

    //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");
            }
    
  7. V nabídce File (Soubor) klikněte na Save All (Uložit vše).

  8. V nabídce Sestavení klikněte na Sestavit řešení.

Testování vlastního hostitele pomocí procesoru direktiv

Pokud chcete otestovat hostitele vlastní textové šablony, musíte nejprve napsat textovou šablonu, která volá vygenerovaný procesor direktiv. Potom spustíte vlastního hostitele, předáte mu název textové šablony a ověříte, že se direktiva zpracuje správně.

Vytvoření textové šablony pro otestování vlastního hostitele

  1. Vytvořte textový soubor a pojmenujte ho TestTemplateWithDP.tt. K vytvoření souboru můžete použít libovolný textový editor, například Poznámkový blok.

  2. Do tohoto textového souboru přidejte následující text:

    Poznámka:

    Programovací jazyk textové šablony nemusí odpovídat programovacímu jazyku vlastního hostitele.

    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("");
        }
    #>
    
  3. V kódu nahraďte <CESTU> cestou k souboru Sample.min z jazyka specifického pro návrh, který jste vytvořili v prvním postupu.

  4. Soubor uložte a zavřete.

Testování vlastního hostitele

  1. Otevřete okno příkazového řádku.

  2. Zadejte cestu ke spustitelnému souboru vlastního hostitele, ale zatím nemačkejte klávesu ENTER.

    Zadejte například:

    <YOUR PATH>CustomHost\bin\Debug\CustomHost.exe

    Poznámka:

    Místo zadávání adresy můžete přejít na soubor CustomHost.exe v Průzkumníku Windows a potom soubor přetáhnout do okna příkazového řádku.

  3. Zadejte mezeru.

  4. Zadejte cestu k souboru textové šablony a stiskněte klávesu ENTER.

    Zadejte například:

    <YOUR PATH>TestTemplateWithDP.txt

    Poznámka:

    Místo zadávání adresy můžete v Průzkumníku Windows přejít na soubor TestTemplateWithDP.txt a potom soubor přetáhnout do okna příkazového řádku.

    Vlastní hostitelská aplikace se spustí a spustí proces transformace textové šablony.

  5. V Průzkumníku Windows přejděte do složky, která obsahuje soubor TestTemplateWithDP.txt.

    Složka obsahuje také soubor TestTemplateWithDP1.txt.

  6. Otevřete tento soubor a podívejte se na výsledky transformace textové šablony.

    Zobrazí se výsledky vygenerovaného textového výstupu a měly by vypadat takto:

    Text Template Host Test
    
    Box: ExampleElement1
    Linked to: ExampleElement2
    
    Box: ExampleElement2
    Linked from: ExampleElement1