DSL(Domain-Specific Language) 솔루션은 Visual Studio에서 DSL의 인스턴스를 읽고 업데이트하는 데 사용할 수 있는 API를 생성합니다. 이 API는 DSL 정의에서 생성된 코드에 정의됩니다. 이 항목에서는 생성된 API에 대해 설명합니다.
예제 솔루션: 구성 요소 다이어그램
이 항목에서 대부분의 예제의 원본인 솔루션을 만들려면 구성 요소 모델 솔루션 템플릿에서 DSL을 만듭니다. 새 DSL 솔루션을 만들 때 표시되는 표준 템플릿 중 하나입니다.
비고
구성 요소 다이어그램 DSL 템플릿을 Domain-Specific Language Designer(도메인 전용 언어 설계 도구)라고 합니다.
이 솔루션 템플릿에 익숙하지 않은 경우 F5 키를 누르고 실험합니다. 특히 포트 도구를 구성 요소로 끌어서 포트를 만들고 포트를 연결할 수 있습니다.
DSL 솔루션의 구조
Dsl 프로젝트는 DSL에 대한 API를 정의합니다. DslPackage 프로젝트는 Visual Studio와 통합하는 방법을 정의합니다. 모델에서 생성된 코드를 포함할 수도 있는 고유한 프로젝트를 추가할 수도 있습니다.
코드 디렉터리
이러한 각 프로젝트의 코드 대부분은 Dsl\DslDefinition.dsl에서 생성됩니다. 생성된 코드는 생성된 코드 폴더에 있습니다. 생성된 파일을 보려면 생성된 .tt 파일 옆에 있는 [+]를 클릭합니다.
DSL을 이해하는 데 도움이 되도록 생성된 코드를 검사하는 것이 좋습니다. 생성된 파일을 보려면 솔루션 탐색기에서 *.tt 파일을 확장합니다.
*.tt 파일에는 생성 코드가 거의 없습니다. 대신 지시문(c0)을 사용하여 공유 템플릿 파일을 포함시킵니다. 공유 파일은 \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates에서 찾을 수 있습니다.
DSL 솔루션에 사용자 고유의 프로그램 코드를 추가하는 경우 생성된 코드 폴더 외부의 별도 파일에 추가합니다. 사용자 지정 코드 폴더를 만들 수 있습니다. (사용자 지정 폴더에 새 코드 파일을 추가할 때는 초기 코드 구조에서 네임스페이스를 수정해야 합니다.)
솔루션을 다시 빌드할 때 편집 내용이 손실되므로 생성된 코드를 직접 편집하지 않는 것이 좋습니다. 대신 DSL을 사용자 지정하려면 다음을 수행합니다.
DSL 정의에서 많은 매개 변수를 조정합니다.
생성된 클래스에 정의되거나 상속되는 메서드를 재정의하기 위해 부분 클래스를 별도의 코드 파일에 작성합니다. 경우에 따라 생성된 메서드를 재정의하려면 DSL 정의에서 클래스의 Double Derived 생성 옵션을 설정해야 합니다.
생성된 코드가 사용자 고유의 코드에 '후크'를 제공하도록 하는 DSL 정의의 옵션을 설정합니다.
예를 들어 도메인 클래스의 사용자 지정 생성자 있음 옵션을 설정한 다음 솔루션을 빌드하면 오류 메시지가 표시됩니다. 이러한 오류 메시지 중 하나를 두 번 클릭하면 생성된 코드에 사용자 지정 코드가 제공해야 하는 내용을 설명하는 주석이 표시됩니다.
사용자 고유의 텍스트 템플릿을 작성하여 애플리케이션과 관련된 코드를 생성합니다. 포함 파일을 사용하여 많은 프로젝트에 공통적인 템플릿의 일부를 공유할 수 있으며 Visual Studio 프로젝트 템플릿을 만들어 사용자 고유의 파일 구조로 초기화된 프로젝트를 설정할 수 있습니다.
Dsl에서 생성된 파일
다음 생성된 파일이 Dsl 프로젝트에 표시됩니다.
YourDslSchema.xsd
DSL 인스턴스를 포함하는 파일의 스키마입니다. 이 파일은 컴파일(bin) 디렉터리에 복사됩니다. DSL을 설치할 때 모델 파일의 유효성을 검사할 수 있도록 이 파일을 \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas 에 복사할 수 있습니다. 자세한 내용은 Domain-Specific 언어 솔루션 배포를 참조하세요.
DSL 탐색기에서 옵션을 설정하여 serialization을 사용자 지정하면 스키마가 그에 따라 변경됩니다. 그러나 고유한 serialization 코드를 작성하는 경우 이 파일은 더 이상 실제 스키마를 나타내지 않을 수 있습니다. 자세한 내용은 파일 스토리지 및 XML Serialization 사용자 지정을 참조하세요.
ConnectionBuilders.cs
연결 작성기는 관계를 만드는 클래스입니다. 연결 도구 뒤에 있는 코드입니다. 이 파일에는 각 연결 도구에 대한 클래스 쌍이 포함되어 있습니다. 해당 이름은 도메인 관계 및 연결 도구인 관계작성기 및 ConnectorToolConnectAction의 이름에서 파생됩니다.
(구성 요소 솔루션 예제에서 연결 작성기 중 하나를 ConnectionBuilder라고 합니다. 도메인 관계의 이름은 Connection이므로 우연의 일치입니다.)
관계는 RelationshipBuilder.Connect() 메서드에서 만들어집니다. 기본 버전은 원본 및 대상 모델 요소가 허용되는지 확인한 다음 관계를 인스턴스화합니다. 다음은 그 예입니다.
CommentReferencesSubject(sourceAccepted, targetAccepted);
각 작성기 클래스는 DSL 탐색기의 연결 작성기 섹션에 있는 노드에서 생성됩니다. 한 가지 Connect 메서드는 하나 이상의 도메인 클래스 쌍 간에 관계를 만들 수 있습니다. 각 쌍은 작성기 노드 아래의 DSL 탐색기에서 찾을 수 있는 링크 연결 지시문에 의해 정의됩니다.
예를 들어 샘플 DSL의 세 가지 관계 유형 각각에 대해 하나의 연결 작성기 Link Connect 지시문을 추가할 수 있습니다. 이렇게 하면 사용자에게 단일 연결 도구가 제공됩니다. 인스턴스화된 관계의 형식은 사용자가 선택한 원본 및 대상 요소의 형식에 따라 달라집니다. 링크 연결 지시문을 추가하려면 DSL 탐색기에서 작성기를 마우스 오른쪽 단추로 클릭합니다.
특정 유형의 도메인 관계를 만들 때 실행되는 사용자 지정 코드를 작성하려면 작성기 노드에서 적절한 Link Connect 지시문을 선택합니다. 속성 창에서 사용자 지정 연결 사용을 설정합니다. 솔루션을 다시 빌드한 다음, 결과 오류를 수정하는 코드를 제공합니다.
사용자가 이 연결 도구를 사용할 때마다 실행되는 사용자 지정 코드를 작성하려면 연결 작성기의 Is Custom 속성을 설정합니다. 원본 요소의 허용 여부, 원본 및 대상의 특정 조합이 허용되는지 여부 및 연결 시 모델에 대해 어떤 업데이트를 수행해야 하는지를 결정하는 코드를 제공할 수 있습니다. 예를 들어 다이어그램에 루프를 만들지 않는 경우에만 연결을 허용할 수 있습니다. 단일 관계 링크 대신 원본과 대상 간의 여러 상호 관련된 요소의 더 복잡한 패턴을 인스턴스화할 수 있습니다.
Connectors.cs
일반적으로 참조 관계를 나타내는 다이어그램 요소인 커넥터에 대한 클래스를 포함합니다. 각 클래스는 DSL 정의의 한 커넥터에서 생성됩니다. 모든 커넥터 클래스는 BinaryLinkShape로부터 파생됩니다.
런타임에 색 및 기타 스타일 기능 변수를 만들려면 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭하고 노출 추가를 가리킵니다.
런타임에 추가 스타일 기능을 변수로 만들려면 예제 TextField 및 ShapeElement를 참조하세요.
Diagram.cs
다이어그램을 정의하는 클래스를 포함합니다. 에서 파생됩니다 Diagram.
런타임에 색 및 기타 스타일 기능 변수를 만들려면 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭하고 노출 추가를 가리킵니다.
또한 이 파일에는 FixupDiagram 새 요소가 모델에 추가되면 응답하는 규칙이 포함되어 있습니다. 규칙은 새 셰이프를 추가하고 셰이프를 모델 요소에 연결합니다.
DirectiveProcessor.cs
이 지시문 프로세서는 사용자가 DSL 인스턴스를 읽는 텍스트 템플릿을 작성하는 데 도움이 됩니다. 지시문 프로세서는 DSL에 대한 어셈블리(DLL)를 로드하고 네임스페이스에 대한 명령문을 using 에 효과적으로 추가합니다. 이렇게 하면 텍스트 템플릿의 코드에서 DSL에서 정의한 클래스 및 관계를 사용할 수 있습니다.
자세한 내용은 Domain-Specific 언어에서 코드 생성 및 사용자 지정 T4 텍스트 템플릿 지시문 프로세서 만들기를 참조하세요.
DomainClasses.cs
추상 클래스 및 모델 루트 클래스를 포함하여 정의한 도메인 클래스의 구현입니다. 에서 파생됩니다 ModelElement.
각 도메인 클래스에는 다음이 포함됩니다.
각 도메인 속성에 대한 속성 정의 및 중첩 처리기 클래스입니다. OnValueChanging() 및 OnValueChanged()를 재정의할 수 있습니다. 자세한 내용은 도메인 속성 값 변경 처리기를 참조하세요.
예제 DSL에서 클래스에는
Comment속성Text및 처리기 클래스TextPropertyHandler가 포함됩니다.이 도메인 클래스가 참여하는 관계의 접근자 속성입니다. 역할 속성에 대한 중첩 클래스는 없습니다.
예제 DSL의
Comment클래스에는 포함 관계ComponentModelHasComments을 통해 부모 모델에 액세스할 수 있는 접근자가 포함되어 있습니다.생성자. 이러한 생성자를 재정의하려면 도메인 클래스에 사용자 지정 생성자를 설정합니다.
EGP(요소 그룹 프로토타입) 처리기 메서드입니다. 사용자가 다른 요소를 이 클래스의 인스턴스에 병합 (추가)할 수 있는 경우 필요합니다. 일반적으로 사용자는 요소 도구 또는 다른 셰이프에서 끌거나 붙여넣어 이 작업을 수행합니다.
예제 DSL에서 입력 포트 또는 출력 포트를 구성 요소에 병합할 수 있습니다. 또한 구성 요소 및 주석을 모델에 병합할 수 있습니다. 이
Component 클래스의 EGP 처리기 메서드를 사용하면 Component에서 포트를 수락할 수 있지만 주석은 허용하지 않습니다. 루트 모델 클래스의 EGP 처리기는 주석 및 구성 요소를 허용하지만 포트는 허용하지 않습니다.
DomainModel.cs도메인 모델을 나타내는 클래스입니다. 에서 파생됩니다 DomainModel.
비고
이는 모델의 루트 클래스와 동일하지 않습니다.
클로저 복사 및 삭제는 요소를 복사하거나 삭제할 때 포함해야 하는 다른 요소를 정의합니다. 모든 관계의 각 측면에서 역할의 전파 복사 및 전파 삭제 속성을 설정하여 이 동작을 제어할 수 있습니다. 값을 동적으로 결정하려면 클로저 클래스의 메서드를 재정의하는 코드를 작성할 수 있습니다.
DomainModelResx.resx
여기에는 도메인 클래스 및 속성, 속성 이름, 도구 상자 레이블, 표준 오류 메시지 및 사용자에게 표시될 수 있는 기타 문자열에 대한 설명과 같은 문자열이 포함됩니다. 또한 이미지 셰이프에 대한 도구 아이콘 및 이미지가 포함되어 있습니다.
이 파일은 기본 제공 어셈블리에 바인딩되며 이러한 리소스의 기본값을 제공합니다. 지역화된 버전의 리소스를 포함하는 위성 어셈블리를 만들어 DSL을 지역화할 수 있습니다. 해당 버전은 DSL이 지역화된 리소스와 일치하는 문화권에 설치될 때 사용됩니다. 자세한 내용은 Domain-Specific 언어 솔루션 배포를 참조하세요.
DomainRelationships.cs
모델의 두 요소 사이의 각 링크는 도메인 관계 클래스의 인스턴스로 표시됩니다. 모든 관계 클래스는 ElementLink에서 파생되며, ElementLink는 다시 ModelElement에서 파생됩니다. ModelElement이므로 관계의 인스턴스에는 속성이 있을 수 있으며 관계의 원본 또는 대상이 될 수 있습니다.
HelpKeywordHelper.cs
사용자가 F1 키를 누를 때 사용되는 함수를 제공합니다.
MultiplicityValidation.cs
1..1 또는 1..*의 곱함을 지정하는 관계 역할에서 관계 인스턴스가 하나 이상 필요하다는 경고를 사용자에게 표시해야 합니다. 이 파일은 이러한 경고를 구현하는 유효성 검사 제약 조건을 제공합니다. 포함 부모에 대한 1..1 링크가 확인되지 않았습니다.
이러한 제약 조건을 실행하려면 DSL 탐색기의 Editor\Validation 노드에서 사용 옵션 중 하나를 설정해야 합니다. 자세한 내용은 Domain-Specific 언어의 유효성 검사를 참조하세요.
PropertiesGrid.cs
이 파일에는 사용자 지정 형식 설명자를 도메인 속성에 연결한 경우에만 코드가 포함됩니다. 자세한 내용은 속성 창 사용자 지정을 참조하세요.
SerializationHelper.cs
동일한 모니커에서 두 요소를 참조하지 않도록 하는 유효성 검사 메서드입니다. 자세한 내용은 파일 스토리지 및 XML Serialization 사용자 지정을 참조하세요.
serializationHelper 클래스는 serialization 클래스에서 공통적으로 사용되는 함수를 제공합니다.
Serializer.cs각 도메인 클래스, 관계, 셰이프, 연결선, 다이어그램 및 모델에 대한 serializer 클래스입니다.
이러한 클래스의 많은 기능은 Xml Serialization 동작 아래의 DSL 탐색기의 설정에 의해 제어할 수 있습니다.
Shapes.csDSL 정의의 모든 셰이프 클래스에 대한 클래스입니다. 도형은 NodeShape에서 파생됩니다. 자세한 내용은 파일 스토리지 및 XML Serialization 사용자 지정을 참조하세요.
생성된 메서드를 partial 클래스의 고유한 메서드로 재정의하려면 DSL 정의에서 커넥터에 대해 Double Derived 생성 을 설정합니다. 생성자를 사용자 고유의 코드로 바꾸려면 Has Custom Constructor를 설정합니다.
런타임에 색 및 기타 스타일 기능 변수를 만들려면 DSL 정의 다이어그램에서 클래스를 마우스 오른쪽 단추로 클릭하고 노출 추가를 가리킵니다.
런타임에 추가 스타일 기능을 변동 가능하게 하려면 예를 들어 TextField 및 ShapeElement를 참조하십시오.
ToolboxHelper.cs요소 도구에 요소 그룹 프로토타입을 설치하여 도구 상자를 설정합니다. 이러한 프로토타입의 복사본은 사용자가 도구를 실행할 때 대상 요소와 병합됩니다.
여러 개체를 만드는 그룹을 위한 도구 상자 항목을 정의할 수 있도록
CreateElementPrototype()을(를) 재정의할 수 있습니다. 예를 들어 하위 구성 요소가 있는 개체를 나타내는 항목을 정의할 수 있습니다. 코드를 변경한 후 Visual Studio의 실험적 인스턴스를 다시 설정하여 도구 상자 캐시를 지웁니다.
DslPackage 프로젝트에서 생성된 파일
DslPackage는 DSL 모델을 Visual Studio 셸에 연결하여 창, 도구 상자 및 메뉴 명령을 관리합니다. 대부분의 클래스는 이중 파생되므로 메서드를 재정의할 수 있습니다.
CommandSet.cs
다이어그램에 표시되는 마우스 오른쪽 단추 클릭 메뉴 명령입니다. 이 집합을 조정하거나 추가할 수 있습니다. 이 파일에는 명령에 대한 코드가 포함되어 있습니다. 메뉴의 명령 위치는 Commands.vsct 파일에 의해 결정됩니다. 자세한 내용은 사용자 명령 및 작업 작성을 참조하세요.
Constants.cs
GUID.
DocData.cs
YourDslDocData 는 모델을 파일에 로드하고 저장하는 작업을 관리하고 Store 인스턴스를 만듭니다.
예를 들어 DSL을 파일이 아닌 데이터베이스에 저장하고 싶다면 Load 메서드와 Save 메서드를 재정의할 수 있습니다.
DocView.cs
YourDslDocView 는 다이어그램이 표시되는 창을 관리합니다. 예를 들어 Windows Form 내에 다이어그램을 포함할 수 있습니다.
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을(를) 인스턴스화합니다. DSL 패키지가 시작될 때 Visual Studio에서 편집기를 여는 데 사용하는 표준 인터페이스를 충족합니다. Package.cs의 ProvideEditorFactory 속성에서 참조됩니다.
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의 Include 속성이 True있는지 확인합니다.
이 파일은 DSL이 VSIX(Visual Studio 통합 확장)로 패키지되는 방법을 제어합니다. 자세한 내용은 Domain-Specific 언어 솔루션 배포를 참조하세요.