연습: 생성된 지시문 프로세서에 호스트 연결
텍스트 템플릿을 처리하는 고유한 호스트를 쓸 수 있습니다. 기본 사용자 지정 호스트는 연습: 사용자 지정 텍스트 템플릿 호스트 만들기에 설명되어 있습니다. 해당 호스트를 확장하여 여러 출력 파일 생성 등의 기능을 추가할 수 있습니다.
이 연습에서는 지시문 프로세서를 호출하는 텍스트 템플릿을 지원하도록 사용자 지정 호스트를 확장합니다. 도메인별 언어를 정의하면 도메인 모델에 대한 지시문 프로세서가 생성됩니다. 지시문 프로세서를 사용하면 사용자가 모델에 액세스하는 템플릿을 더 쉽게 작성할 수 있으므로 템플릿에서 어셈블리 및 가져오기 지시문을 작성할 필요성이 줄어듭니다.
참고 항목
이 연습은 연습: 사용자 지정 텍스트 템플릿 호스트 만들기를 기반으로 합니다. 먼저 이 연습을 수행합니다.
이 연습에는 다음 작업이 포함됩니다.
도메인 특정 언어 도구를 사용하여 도메인 모델을 기반으로 하는 지시문 프로세서를 생성합니다.
사용자 지정 텍스트 템플릿 호스트를 생성된 지시문 프로세서에 연결합니다.
생성된 지시문 프로세서를 사용하여 사용자 지정 호스트
필수 조건
DSL을 정의하려면 다음 구성 요소를 설치해야 합니다.
구성 요소 | 링크 |
---|---|
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 |
참고 항목
텍스트 템플릿 변환 구성 요소는 Visual Studio 확장 개발 워크로드의 일부로 자동으로 설치됩니다. Visual Studio 설치 프로그램의 개별 구성 요소 탭, SDK, 라이브러리, 프레임워크 범주 아래에서 설치할 수도 있습니다. 개별 구성 요소 탭에서 Modeling SDK 구성 요소를 설치합니다.
또한 연습: 사용자 지정 텍스트 템플릿 호스트 만들기에서 만든 사용자 지정 텍스트 템플릿 변형이 있어야 합니다.
도메인 특정 언어 도구를 사용하여 지시문 프로세서 생성
이 연습에서는 도메인 특정 언어 디자이너 마법사를 사용하여 DSLMinimalTest 솔루션에 대한 도메인 특정 언어를 만듭니다.
다음과 같은 특징이 있는 도메인 특정 언어 솔루션을 만듭니다.
이름: DSLMinimalTest
솔루션 템플릿: Minimal Language
파일 확장명: min
회사 이름: Fabrikam
도메인 특정 언어 솔루션 만들기에 대한 자세한 내용은 방법: 도메인 특정 언어 솔루션 만들기를 참조하세요.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
Important
이 단계에서는 지시문 프로세서를 생성하고 레지스트리에 대한 키를 추가합니다.
디버그 메뉴에서 디버깅 시작을 클릭합니다.
Visual Studio의 두 번째 인스턴스가 열립니다.
실험적 빌드의 솔루션 탐색기에서 sample.min 파일을 두 번 클릭합니다.
파일이 디자이너에서 열립니다. 모델에는 두 가지 요소인 ExampleElement1 및 ExampleElement2와 그 사이의 링크가 있습니다.
Visual Studio의 두 번째 인스턴스를 닫습니다.
솔루션을 저장하고 도메인 특정 언어 디자이너를 닫습니다.
사용자 지정 텍스트 템플릿 호스트를 지시문 프로세서에 연결
지시문 프로세서를 생성한 후 연습: 사용자 지정 텍스트 템플릿 호스트 만들기에서 만든 사용자 지정 텍스트 템플릿 호스트와 지시문 프로세서를 연결합니다.
CustomHost 솔루션을 엽니다.
프로젝트 메뉴에서 참조 추가를 클릭합니다.
참조 추가 대화 상자가 열리고 .NET 탭이 표시됩니다.
다음 참조를 추가합니다.
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
Program.cs 또는 Module1.vb의 맨 위에 다음 코드 줄을 추가합니다.
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 }; } }
ResolveDirectiveProcessor
함수에 대한 코드를 찾아 다음 코드로 바꿉니다.Important
이 코드에는 연결하려는 생성된 지시문 프로세서의 이름에 대한 하드 코딩된 참조가 포함되어 있습니다. 이를 더 일반적으로 쉽게 만들 수 있습니다. 레지스트리에 나열된 모든 지시문 프로세서를 찾고 일치하는 항목을 찾으려는 경우입니다. 이 경우 호스트는 생성된 모든 지시문 프로세서를 사용합니다.
//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"); }
파일 메뉴에서 모두 저장을 클릭합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
지시문 프로세서를 사용하여 사용자 지정 호스트 테스트
사용자 지정 텍스트 템플릿 호스트를 테스트하려면 먼저 생성된 지시문 프로세서를 호출하는 텍스트 템플릿을 작성해야 합니다. 그런 다음 사용자 지정 호스트를 실행하고 여기에 텍스트 템플릿의 이름을 전달하고 지시문이 올바르게 처리되었는지 확인합니다.
텍스트 템플릿을 만들어 사용자 지정 호스트 테스트
텍스트 파일을 만들고
TestTemplateWithDP.tt
로 이름을 지정합니다. 메모장 등의 모든 텍스트 편집기를 사용하여 파일을 만들 수 있습니다.텍스트 파일에 다음을 추가합니다.
참고 항목
텍스트 템플릿의 프로그래밍 언어는 사용자 지정 호스트의 프로그래밍 언어와 일치하지 않아도 됩니다.
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(""); } #>
코드에서 <YOUR PATH>를 첫 번째 절차에서 만든 디자인 특정 언어의 Sample.min 파일 경로로 바꿉니다.
파일을 저장 후 닫습니다.
사용자 지정 호스트 테스트
명령 프롬프트 창을 엽니다.
사용자 지정 호스트에 대한 실행 가능한 파일의 경로를 입력하고 Enter 키를 누르지 않습니다.
예를 들어 입력 합니다.
<YOUR PATH>CustomHost\bin\Debug\CustomHost.exe
참고 항목
주소를 입력하는 대신 Windows 탐색기에서 CustomHost.exe 파일로 이동한 다음 이 파일을 명령 프롬프트 창으로 끌 수 있습니다.
공백을 입력합니다.
텍스트 템플릿 파일의 경로를 입력한 다음 Enter 키를 누릅니다.
예를 들어 입력 합니다.
<YOUR PATH>TestTemplateWithDP.txt
참고 항목
주소를 입력하는 대신 Windows 탐색기에서 TestTemplateWithDP.txt 파일로 이동한 다음 이 파일을 명령 프롬프트 창으로 끌 수 있습니다.
사용자 지정 호스트 애플리케이션이 실행되어 텍스트 템플릿 변형 프로세스를 시작합니다.
Windows 탐색기에서 TestTemplateWithDP.txt 파일이 포함된 폴더로 이동합니다.
이 폴더에는 TestTemplateWithDP1.txt 파일도 포함되어 있습니다.
이 파일을 열어 텍스트 템플릿 변환의 결과를 확인합니다.
생성된 텍스트 출력의 결과가 다음과 같이 표시됩니다.
Text Template Host Test Box: ExampleElement1 Linked to: ExampleElement2 Box: ExampleElement2 Linked from: ExampleElement1