DSL 코드 이해

도메인 관련 언어 (DSL) 솔루션을 읽고 DSL에 인스턴스를 업데이트 하는 데 사용할 수 있는 API 생성 Visual Studio.이 API는 DSL 정의 로부터 생성 되는 코드에서 정의 됩니다.이 항목에서는 생성 된 API에 설명합니다.

이 솔루션 예: 구성 요소 다이어그램

DSL에서 소스 대부분은이 항목의 예제에에서는 솔루션을 만들려면 만들기는 컴포넌트 모델 솔루션 템플릿.이 새 DSL 솔루션을 만들 때 나타나는 표준 템플릿 중 하나입니다.

[!참고]

구성 요소 다이어그램 DSL 템플릿 아키텍처 메뉴를 사용 하 여 만들 수 있는 UML 구성 요소 다이어그램 관련이 없습니다 Visual Studio Ultimate.에 있는 새 프로젝트 대화 상자에서 확장 기타 프로젝트 Types\Extensibility 하 고 다음을 클릭 도메인 관련 언어 디자이너.

이 솔루션 템플릿과 익숙하지 않은 경우 실험을 하 고 F5 키를 누릅니다.특히 포트 도구 구성 요소를 드래그 하 여 포트를 만드는 것과 포트를 연결할 수 있는지 확인할 수 있습니다.

구성 요소 및 상호 연결된 포트

DSL 솔루션의 구조

Dsl 프로젝트를 DSL에 대 한 API를 정의 합니다.DslPackage 프로젝트를 정의 하는 방법으로 통합 Visual Studio.모델에서 생성 된 코드를 포함할 수도 있습니다 자신의 프로젝트를 추가할 수도 있습니다.

Bb286947.collapse_all(ko-kr,VS.110).gif코드 디렉터리

대부분의 이러한 프로젝트의 각 코드에서 생성 된 Dsl\DslDefinition.dsl.생성 된 코드에는 있는 Generated Code 폴더.생성 된 파일을 보려면 클릭 [+] 생성 하는 옆에 .tt 파일입니다.

DSL을 이해 하는 데 도움이 되는 생성 된 코드를 검사 하는 것이 좋습니다.생성 된 파일을 보려면 솔루션 탐색기에서 *.tt 파일을 확장 합니다.

*.Tt 파일이 생성 된 코드가 거의 포함.대신 사용 <#include> 공유 서식 파일을 포함 하는 지시문입니다.공유 파일을 찾을 수 있습니다.\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates

프로그램 코드를 직접 DSL 솔루션에 추가 하면 외부 코드 생성 된 폴더는 별도 파일에 추가 합니다.만들어야 할 수 있습니다는 Custom Code 폴더입니다.(새 코드 파일에는 사용자 지정 폴더를 추가 하는 경우 네임 스페이스 초기 코드 뼈대를 해결 해야 합니다.)

솔루션을 다시 때 편집한 내용이 손실 될 수 있으므로 사용자는 생성 된 코드를 직접 편집 하지 않는 것이 좋습니다.대신 DSL을 사용자 지정 하려면:

  • 다양 한 DSL 정의에 매개 변수를 조정 합니다.

  • 정의 되거나 생성 된 클래스에 의해 상속 된 메서드를 재정의 하려면 별도 코드 파일에 partial 클래스를 작성 합니다.설정할 수 있는 일부 경우에는 생성 이중 파생 옵션 DSL 정의에서 생성 된 메서드를 재정의할 수 있도록 합니다.

  • 생성 된 코드를 '고리'에 대 한 코드를 직접 제공 하는 DSL 정의 옵션을 설정 합니다.

    예를 들어, 사용자가 설정한는 사용자 정의 생성자가 도메인 클래스의 옵션 및 솔루션을 빌드한 다음, 오류 메시지가 표시 될 수 있습니다.이러한 오류 메시지 중 하나를 두 번 클릭할 때 어떤 사용자 지정 코드를 제공 합니다 설명 주석이 생성 된 코드에서 표시 됩니다.

  • 응용 프로그램에 코드를 생성 하려면 텍스트 템플릿을 직접 작성 합니다.에서는 사용 부품의 많은 프로젝트에 일반적인 서식 파일을 공유 하는 파일을 포함할 수 있습니다 및 만들 수 있습니다 Visual Studio 프로젝트 템플릿은 고유한 파일 구조를 초기화 하는 프로젝트를 설정 하려면.

Dsl에서 생성 되는 파일

다음 생성 되는 파일에 표시를 Dsl 프로젝트입니다.

파일 이름

설명

YourDslSchema.xsd

DSL의 인스턴스를 포함 하는 파일에 대 한 스키마입니다.이 파일을 복사 하 고 (bin) 디렉터리입니다.DSL을 설치할 때이 파일을 복사할 수 있습니다 \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas 모델 파일 유효성을 검사할 수 있도록 합니다.자세한 내용은 도메인별 언어 솔루션 배포를 참조하십시오.

DSL 탐색기에서 옵션을 설정 하 여 serialization을 사용자 지정 하는 경우 스키마에 따라 변경 됩니다.그러나 serialization 코드를 직접 작성 하는 경우이 파일이 더 이상 실제 스키마를 나타낼 수 없습니다.자세한 내용은 파일 저장소 및 XML Serialization 사용자 지정를 참조하십시오.

ConnectionBuilders.cs

연결 작성기 관계를 만드는 클래스입니다.이 코드 숨김 연결 도구입니다.이 파일 한 쌍의 각 연결 도구에 대 한 클래스를 포함합니다.자신의 이름을 도메인 관계 및 연결 도구 이름에서 파생 된: 관계작성기, 및 ConnectorToolConnectAction.

(컴포넌트 솔루션 예제에서 연결 작성기 중 하나가 ConnectionBuilder 호출 됩니다, 그리고 도메인 관계 명명 된 연결 때문에 만든 것입니다.)

관계 생성 됩니다 있는 관계Builder.Connect() 메서드.원본 및 대상 모델 요소에 적합 하 고 다음 관계를 인스턴스화합니다 기본 버전을 확인 합니다.예를 들면 다음과 같습니다.

CommentReferencesSubject(sourceAccepted, targetAccepted);

각 작성기 클래스의 노드에서 생성 되는 연결 작성기 DSL 탐색기에서 섹션.하나 Connect 메서드는 도메인 클래스 중 하나 이상의 쌍 간의 관계를 만들 수 있습니다.각 쌍은 링크 연결 DSL 탐색기에서 작성기 노드 아래에서 찾을 수 있습니다 지시문으로 정의 됩니다.

예를 들어, 각 관계 DSL이 샘플에는 세 가지 종류의 하나의 연결 작성기 연결 링크 지시문을 추가할 수 있습니다.이 사용자 단일 연결 도구를 제공 합니다.사용자가 선택한 원본 및 대상 요소 유형의 인스턴스화할 관계 유형을 따라 달라 집니다.연결 링크 지시문을 추가 하려면 작성기 DSL 탐색기에서를 마우스 오른쪽 단추로 클릭 합니다.

특정 유형의 도메인 관계를 만들 때 실행 되는 사용자 지정 코드를 작성 하려면 연결할 적절 한 링크 지시문 작성기 노드 아래의 노드를 선택 합니다.속성 창에서 설정 사용자 지정 연결을 사용 하 여.솔루션을 다시 빌드해야 하 고 결과 오류를 수정 하는 코드를 제공 합니다.

사용자가이 연결 도구를 사용할 때마다 실행 되는 사용자 지정 코드를 작성 하려면 설정의 입니다 사용자 지정 연결 작성기의 속성입니다.특정 조합이 원본 여부 원본 요소 허용 및 대상 허용 됩니다, 그리고 및 연결 될 때 어떤 업데이트가 모델에 등록 해야 여부를 결정 하는 코드를 제공할 수 있습니다.예를 들어 다이어그램에서 루프 만들 수 없습니다만 하면 연결이 가능 합니다.대신 단일 관계 링크, 더 복잡 한 패턴을 위하여 여러 가지 요소 소스와 대상 사이 인스턴스화할 수 있습니다.

Connectors.cs

일반적으로 참조 관계를 나타내는 다이어그램 요소는 커넥터에 대 한 클래스를 포함 합니다.각 클래스는 DSL 정의에 하나의 커넥터에서 생성 됩니다.모든 커넥터 클래스에서 파생 된BinaryLinkShape

색 및 다른 스타일 피쳐 변수 런타임에 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭 한 지점에 추가 노출.

런타임에 추가 스타일 피쳐 변수를 만들려면 예를 참조 하십시오. TextFieldShapeElement.

Diagram.cs

다이어그램을 정의 하는 클래스를 포함 합니다.파생 된 Diagram.

색 및 다른 스타일 피쳐 변수 런타임에 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭 한 지점에 추가 노출.

또한이 파일을 포함의 FixupDiagram 모델에 새 요소를 추가할 때 응답 하는 규칙입니다.규칙이 새 도형을 추가 하 고 모델 요소에 있는 셰이프를 연결 합니다.

DirectiveProcessor.cs

이 지시문 프로세서 인스턴스를 DSL 읽을 텍스트 템플릿을 작성할 수 있습니다.지시문 프로세서를 DSL에 대 한 어셈블리 (Dll)를 로드 하 고 효과적으로 삽입 합니다. using 네임 스페이스에 대 한 문의입니다.이 텍스트 템플릿 클래스를 DSL에 정의 된 관계를 사용 하는 코드를 있습니다.

자세한 내용은 도메인별 언어에서 코드 생성사용자 지정 T4 텍스트 템플릿 지시문 프로세서 만들기을 참조하십시오.

DomainClasses.cs

도메인 모델 루트 클래스와 추상 클래스를 포함 하 여 정의 하는 클래스를 구현 합니다.파생 된 ModelElement.

각 도메인 클래스에 있습니다.

  • 속성 정 및 각 도메인 속성에 대 한 중첩 된 처리기 클래스입니다.OnValueChanging() 및 Onvaluechanged()를 재정의할 수 있습니다.자세한 내용은 도메인 속성 값 변경 처리기를 참조하십시오.

    DSL, 예제에서는 Comment 클래스를 포함 하는 속성 Text 및 처리기 클래스 TextPropertyHandler.

  • 이 도메인 클래스에 참여 하는 관계에 대 한 접근자 속성입니다.(역할 속성에 대 한 중첩된 클래스가 없습니다입니다.)

    DSL, 예제에서는 Comment 클래스에는 포함 관계를 통해 해당 모 피쳐 모델에 액세스 하는 접근자가 ComponentModelHasComments.

  • 생성자가 있습니다.이 재정의 하려면 설정 사용자 정의 생성자가 도메인 클래스에 있습니다.

  • 요소 그룹 프로토타입 (EGP) 처리기 메서드를 사용 합니다.이러한 필요한 사용자 수 있습니다 경우입니다 병합 (추가)이이 클래스의 인스턴스를 다른 요소입니다.일반적으로 사용자가이 요소 도구 또는 다른 셰이프를 끌어 또는 붙여 넣어 하지 않습니다.

    구성 요소를 복사 하는 DSL, 포트 입력 또는 출력 포트를 병합할 수 있습니다.또한 구성 요소와 주석이 모델에 병합할 수 있습니다.

    EGP 처리기 메서드는 Component 클래스에서 포트를 있지만 않는 의견을 받아들이도록 구성 요소가 있습니다.EGP 처리기 루트 모델 클래스에서 주석 및 구성 요소를 있지만 않은 포트를 사용할 수 있습니다.

DomainModel.cs

도메인 모델을 나타내는 클래스입니다.파생 된 DomainModel.

참고참고
이 모델의 루트 클래스 입니다지 않습니다.

복사와 삭제는 클로저 정의할 다른 요소를 어떻게 지정 해야 요소에서 복사 되거나 삭제 되는 경우를 포함 합니다.설정 하 여이 동작을 제어할 수 있습니다의 전파 복사전파 삭제 모든 관계의 양쪽에서 역할의 속성을.값에 따라 동적으로 결정 하려면 클로저 클래스의 메서드를 재정의 하는 코드를 작성할 수 있습니다.자세한 내용은 방법: 프로그램 복사 및 붙여넣기 동작 - 리디렉션를 참조하십시오.

DomainModelResx.resx

이 문자열의 설명 등을 도메인 클래스와 속성, 속성 이름, 레이블 도구 상자, 표준 오류 메시지 및 사용자에 게 표시 될 수 있습니다 다른 문자열을 포함 합니다.도구 아이콘 및 이미지 모양에 대 한 이미지가 들어 있습니다.

이 파일은 빌드된 어셈블리에 연결 된, 이러한 리소스에는 기본값을 제공 합니다.리소스의 지역화 된 버전을 포함 하는 위성 어셈블리를 만들어 해당 DSL를 지역화할 수 있습니다.DSL의 지역화 된 리소스와 일치 하는 culture에 설치 되어 있는 경우 해당 버전이 사용 됩니다.자세한 내용은 도메인별 언어 솔루션 배포를 참조하십시오.

DomainRelationships.cs

각 모델에는 두 요소 사이의 링크는 도메인 관계 클래스의 인스턴스로 표현 됩니다.모든 관계 클래스에서 파생 된 lElementLink를 차례로 됩니다 파생에서 ModelElement.모델 요소 이므로 관계 인스턴스 속성이 있을 수 있습니다 및 원본 또는 대상 관계 될 수 있습니다.

HelpKeywordHelper.cs

F1 키를 누를 때 사용 되는 함수를 제공 합니다.

MultiplicityValidation.cs

관계 역할의 복합성은 1 또는 1을 지정.. *, 사용자가 경고 메시지가 표시 됩니다 해당 관계의 인스턴스 중 하나 이상을 반드시 입력 해야 합니다.이 파일은 그러한 경고를 구현 하는 유효성 검사 제약 조건이 있습니다.1 대 한 링크를 포함 하는 부모는 확인 되지 않습니다.

이러한 제약 조건을 실행 하려면 중 하나를 설정 해야 합니다의 사용 하 여... 옵션에 Editor\Validation DSL 탐색기에서에서 노드를 합니다.자세한 내용은 도메인별 언어에서 유효성 검사를 참조하십시오.

PropertiesGrid.cs

만 도메인 등록 정보에는 사용자 지정 형식 설명자를 첨부 한 경우이 파일에는 코드가 들어 있습니다.자세한 내용은 속성 창 사용자 지정를 참조하십시오.

SerializationHelper.cs

  • 두 요소가 같은 모니커에 의해 참조 되는지 확인 하는 유효성 검사 메서드자세한 내용은 파일 저장소 및 XML Serialization 사용자 지정를 참조하십시오.

  • SerializationHelper 클래스를 직렬화 클래스에서 사용 하는 공통 기능을 제공 합니다.

Serializer.cs

각 도메인 클래스, 관계, 도형, 연결선, 다이어그램 및 모델에 대 한 serializer 클래스입니다.

이러한 클래스의 기능 중 많은 DSL 탐색기의 설정으로 제어할 수 있습니다 Xml Serialization 동작.

Shapes.cs

모든 shape 클래스 정의 DSL에 대 한 클래스입니다.도형에서 파생 된 NodeShape.자세한 내용은 파일 저장소 및 XML Serialization 사용자 지정를 참조하십시오.

생성 된 메서드를 partial 클래스에서 사용자 고유의 메서드를 재정의 하려면 설정 생성 이중 파생 된 커넥터의 DSL 정의.생성자 코드를 대체 하도록 설정 사용자 정의 생성자가.

색 및 다른 스타일 피쳐 변수 런타임에 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭 한 지점에 추가 노출.

런타임에 추가 스타일 피쳐 변수를 만들려면 예를 참조 하십시오. TextFieldShapeElement

ToolboxHelper.cs

도구 상자의 구성 요소 그룹 프로토타입을 요소 도구를 설치 하 여 설정 합니다.사용자가 도구를 실행할 때 이러한 프로토타입에 복사 대상 요소와 병합 됩니다.

재정의할 수 CreateElementPrototype() 그룹의 몇 가지 개체를 만드는 도구 상자 항목을 정의 합니다.예를 들어, 하위 구성 요소에 있는 개체를 나타내는 항목을 정의할 수 있습니다.실험적인 인스턴스를 재설정 코드를 변경한 후 Visual Studio 도구 상자 캐시를 지울 수 있습니다.

DslPackage 프로젝트에서 생성 된 파일

Dslpackage는 DSL 모델을 결합 한 것은 Visual Studio 셸, 창, 도구 상자 및 메뉴 명령은 관리 합니다.해당 메서드를 재정의할 수 있습니다. 대부분의 클래스 파생을 double입니다.

파일 이름

설명

CommandSet.cs

다이어그램에 표시 되는 문맥 메뉴 명령입니다.이 집합에 추가 하거나 적용할 수 있습니다.이 파일의 명령에 대 한 코드를 포함합니다.메뉴의 위치는 Commands.vsct 파일에 의해 결정 됩니다.자세한 내용은 사용자 명령 및 작업 작성를 참조하십시오.

Constants.cs

Guid가 있습니다.

DocData.cs

YourDslDocData 로드 하 고 파일을 저장 하는 모델을 관리 하 고 저장소 인스턴스를 만듭니다.

예를 들어, DSL 사용자 파일 대신 데이터베이스에 저장 하려는 경우 재정의 수 있습니다 Load 및 Save 방법입니다.

DocView.cs

YourDslDocView 다이어그램에서 표시 되는 창으로 관리 합니다.예를 들어, 다이어그램 windows 폼을 포함할 수 있습니다.

사용자 정의 컨트롤 파일을 DslPackage 프로젝트에 추가 합니다.다이어그램에 표시 될 수 있습니다 패널을 추가 합니다.단추 및 기타 컨트롤을 추가 합니다.폼의 코드 보기에서 조정 하 여 DSL에 다음 코드를 추가 합니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Shell;
namespace Company.EmbedInForm
{
  public partial class UserControl1 : UserControl
  {
    public UserControl1()
    {
      InitializeComponent();
    }
    
    private DiagramDocView docView;
    public UserControl1(DiagramDocView docView, Control content)
      : this()
    {
      this.docView = docView;
      panel1.Controls.Add(content);
    }
    private void button1_Click(object sender, EventArgs e)
    {
      ExampleModel modelRoot = this.docView.CurrentDiagram.ModelElement as ExampleModel;
      foreach (ExampleElement element in modelRoot.Elements)
      {
       listBox1.Items.Add(element.Name);
      }
    }
  }
  internal partial class EmbedInFormDocView
  {
    private ContainerControl container;
    /// <summary>
    /// Return a User Control instead of the DSL window. 
    /// The user control will contain the DSL window.
    /// </summary>
    public override System.Windows.Forms.IWin32Window Window
    {
      get
      {
        if (container == null)
        {
          // Put the normal DSL Window inside our control
          container = new UserControl1(this, (Control)base.Window);
        }
        return container;
      }
    }
  }
}

EditorFactory.cs

인스턴스화합니다 DocData 및 DocView.표준에 맞는 인터페이스 Visual Studio DSL 패키지를 시작할 때 편집기를 열 때 사용 합니다.참조 되는 ProvideEditorFactory package.cs의 특성

GeneratedVSCT.vsct

표준 메뉴 명령을 다이어그램 상황에 맞는 메뉴와 같은 메뉴를 정하고 편집 메뉴를 합니다.명령에 대 한 코드에서 CommandSet.cs입니다.위치를 변경 하거나 표준 명령을 수정할 수 및 직접 명령을 추가할 수 있습니다.자세한 내용은 사용자 명령 및 작업 작성를 참조하십시오.

ModelExplorer.cs

모델 탐색기를 DSL 정의합니다.이 다이어그램에 함께 표시 되는 모델의 트리 뷰를입니다.

예를 들어, 재정의할 수 InsertTreeView() 요소에서 모델 탐색기를 표시 하는 순서를 변경 합니다.

다이어그램 선택 항목을 동기화 된 상태로 유지 하는 모델 탐색기에서 선택 영역을 원하는 경우 다음 코드를 사용할 수 있습니다.

protected override void OnSelectionChanged(global::System.EventArgs e)
{
base.OnSelectionChanged(e);
// get the selected element
DslModeling::ModelElement selectedElement = 
this.PrimarySelection as DslModeling::ModelElement;
// Select in the model explorer
SelectInModelExplorer<YOURLANGUAGEExplorerToolWindow>(selectedElement);
}
private void SelectInModelExplorer<T>(DslModeling::ModelElement modelElement)
where T : DslShell.ModelExplorerToolWindow
{
DslShell::ModelingPackage package = 
this.GetService(typeof(VSShell.Package)) as DslShell::ModelingPackage;
if (package != null)
{
// find the model explorer window
T explorerWindow = package.GetToolWindow(typeof(T), true) as T;
if (explorerWindow != null)
{
// get the tree container
DslShell.ModelExplorerTreeContainer treeContainer = 
explorerWindow.TreeContainer;
// find the tree node
DslShell.ExplorerTreeNode treeNode = 
treeContainer.FindNodeForElement(modelElement);
// select the node
explorerWindow.TreeContainer.ObjectModelBrowser.SelectedNode = treeNode;
}
}
}

ModelExplorerToolWindow.cs

모델 탐색기에 표시 되는 창을 정의 합니다.탐색기에서 항목의 선택을 처리합니다.

Package.cs

어떻게 DSL에 통합 되어이 파일 정의 Visual Studio.패키지 클래스에 특성 DSL 확장명을 하 고, 해당 도구 상자를 정의 하 고 새 창을 여는 방법을 정의 하는 파일에 대 한 처리기로 등록 합니다.Initialize () 메서드가 호출 되는 첫 번째 DSL입니다 로드 때에 한 번은 Visual Studio 인스턴스.

Source.extension.vsixmanifest

이 파일을 사용자 정의 하려면 편집 하 여 .tt 파일.

주의 정보주의
.Tt 아이콘 또는 이미지 등의 리소스를 포함 하려면 파일을 편집 하는 경우 리소스에 포함 되어 있는지 확인 하십시오 VSIX 빌드에서.솔루션 탐색기에서 파일을 선택 하 고을 VSIX에 포함 속성이 True.

DSL은 Visual Studio 통합 확장 (VSIX에) 패키지를 만드는 방법이 파일을 제어 합니다.자세한 내용은 도메인별 언어 솔루션 배포를 참조하십시오.

참고 항목

개념

도메인별 언어 정의 방법

모델, 클래스 및 관계 이해

도메인별 언어 사용자 지정 및 확장

기타 리소스

도메인별 언어를 사용자 지정하는 코드 작성