共用方式為


逐步解說:將主機連接至產生的指示詞處理器

您可以撰寫自己處理文字範本的主機。示範基本的自訂主機逐步解說:建立自訂文字範本主機。您可以擴充該主機加入函式,例如產生多個輸出檔。

在這個逐步解說中,您會展開您自訂的主應用程式,以支援呼叫指示詞處理器的文字範本。當您定義網域特定語言時,則會產生指示詞處理器的領域模型。指示詞處理器可以方便使用者寫入存取的模型,減少寫入組件,並匯入範本中的指示詞的範本。

注意事項警告

本逐步解說為基礎,在逐步解說:建立自訂文字範本主機。第一次執行該逐步解說。

本逐步解說包含下列工作:

  • 使用Domain-Specific Language Tools來產生網域模型為基礎的指示詞處理器。

  • 若要產生的指示詞處理器的自訂文字 」 範本主機的連接。

  • 測試產生的指示詞處理器與自訂主應用程式。

必要條件

若要定義 DSL,您必須安裝下列元件:

Visual Studio

https://go.microsoft.com/fwlink/?LinkId=185579

Visual Studio SDK

https://go.microsoft.com/fwlink/?LinkId=185580

Visual Studio 的視覺化和模型 SDK

完整.嗎?LinkID = 186128

此外,您必須在建立自訂文字範本轉換逐步解說:建立自訂文字範本主機

若要產生的指示詞處理器使用定義域專屬語言工具

在這個逐步解說中,您可以使用定義域專屬語言設計工具精靈來建立方案 DSLMinimalTest 的定義域專屬語言。

若要使用定義域專屬語言工具產生的網域模型為基礎的指示詞處理器

  1. 建立定義域專屬語言方案具有下列特性:

    • 名稱: DSLMinimalTest

    • 方案範本: 最少的語言

    • 檔案副檔名: 最小值

    • 公司名稱: 連結至 Fabrikam

    如需有關如何建立定義域專屬語言方案的詳細資訊,請參閱HOW TO:建立網域指定的語言方案

  2. 在 [建置] 功能表上,按一下 [建置方案]。

    重要事項重要事項

    這個步驟會產生指示詞處理器,並將此金鑰為它加入登錄中。

  3. 按一下 [偵錯] 功能表上的 [開始偵錯]。

    第二個實例Visual Studio便會開啟。

  4. 在實驗性質的組建中,在方案總管] 中,連按兩下該檔案 sample.min

    此檔案將開啟設計工具中。請注意此模型有兩個項目、 ExampleElement1 及 ExampleElement2,以及它們之間的連結。

  5. 關閉 Visual Studio 的第二個執行個體。 

  6. 儲存方案,並關閉定義域專屬語言設計工具。

連接自訂文字範本主應用程式指示詞處理器

您產生指示詞處理器後,您會連線指示詞處理器,並在所建立的自訂文字範本主機逐步解說:建立自訂文字範本主機

若要自訂文字範本主機產生的指示詞處理器

  1. 開啟 CustomHost 方案。

  2. 在 [專案] 功能表上,按一下 [加入參考]。

    加入參考 會開啟對話方塊 。NET 顯示] 索引標籤。

  3. 將下列參考加入:

    • 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. 在 Program.cs 或 Module1.vb 頂端,加入下列程式碼行:

    using Microsoft.Win32;
    
    Imports Microsoft.Win32
    
  5. 找出屬性的程式碼StandardAssemblyReferences,並取代成下列程式碼:

    注意事項注意事項

    在這個步驟中,則會加入至產生的指示詞處理器,您的主應用程式可以支援所需的組件的參考。

    //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. 找出函式的程式碼ResolveDirectiveProcessor,並取代成下列程式碼:

    重要事項重要事項

    這段程式碼包含硬式編碼的參考,產生的指示詞處理器,您要連線的名稱。您可以輕鬆地讓這更廣泛,在此情況下它會尋找所有的指示詞處理器登錄中列出,並會嘗試尋找相符的項目。在此情況下,主應用程式會處理任何產生的指示詞處理器。

    //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. 在 [檔案] 功能表上,按一下 [全部儲存]。

  8. 在 [建置] 功能表上,按一下 [建置方案]。

測試自訂主應用程式指示詞處理器

若要測試自訂文字範本主應用程式,首先您必須撰寫呼叫產生的指示詞處理器某文字範本。然後執行自訂的主應用程式、 傳遞給它的文字範本名稱,並確認已正確處理指示詞。

若要建立文字範本以測試自訂主應用程式

  1. 建立文字檔案,並命名為 TestTemplateWithDP.tt。您可以使用任何文字編輯器,例如 「 記事本 」 中建立檔案。

  2. 將下列程式碼加入至此文字檔中:

    注意事項注意事項

    文字範本的程式語言不需要自訂主應用程式,使其符合。

    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 
    #>
    
  3. 在 [程式碼,取代 [< 您路徑 > 在第一個程序中所建立的設計特定語言的 Sample.min 檔案的路徑。

  4. 儲存並關閉檔案。

若要測試自訂主應用程式

  1. 開啟 [命令提示字元] 視窗。

  2. 輸入自訂主應用程式可執行檔的路徑,但是還不要按 ENTER。

    例如,輸入:

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

    注意事項注意事項

    代替鍵入地址,您可以瀏覽至檔案 CustomHost.exe 中 Windows 檔案總管,然後將檔案拖曳到 [命令提示字元] 視窗。

  3. 輸入空格。

  4. 輸入文字範本檔的路徑,然後按 ENTER。

    例如,輸入:

    <YOUR PATH>TestTemplateWithDP.txt

    注意事項注意事項

    代替鍵入地址,您可以瀏覽至檔案 TestTemplateWithDP.txt 中 Windows 檔案總管,然後將檔案拖曳到 [命令提示字元] 視窗。

    自訂主應用程式執行,並啟動文字範本轉換程序。

  5. Windows 檔案總管,瀏覽至包含 TestTemplateWithDP.txt 之檔案的資料夾。

    資料夾也包含 TestTemplateWithDP1.txt 的檔案。

  6. 開啟這個檔案來查看文字範本轉換的結果。

    產生的文字輸出結果就會出現,並看起來應該像這樣:

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

請參閱

工作

逐步解說:建立自訂文字範本主機