Udostępnij za pośrednictwem


Opis kodu DSL

Roztwór specyficzne dla domeny języka (DSL) generuje interfejs API, który służy do odczytywania i aktualizowania wystąpień DSL w Visual Studio.Ten interfejs API jest zdefiniowana w kodzie, który jest generowany na podstawie definicji DSL.W tym temacie opisano generowanych interfejsu API.

Roztwór przykład: diagramy składników

W celu utworzenia rozwiązania, który jest źródłem najbardziej przykłady w tym temacie, należy utworzyć DSL z Modeli składnika roztwór szablonu.Jest to jeden ze standardowych szablonów, które pojawia się podczas tworzenia nowego rozwiązania DSL.

[!UWAGA]

Szablon DSL diagramy składników nie jest związana z diagramy składników UML, tworzone przy użyciu menu architektury w Visual Studio Ultimate.W Nowy projekt okno dialogowe rozwiń Inne Types\Extensibility projektu , a następnie kliknij przycisk Projektant języka specyficzne dla domeny.

Naciśnij klawisz F5 i doświadczenia, jeśli nie znasz tego szablonu roztworu.W szczególności zauważyć utworzyć portów przeciągając narzędzie portu na składnik i że porty mogą się łączyć.

Składniki i portów połączonych ze sobą

Struktura roztworu DSL

Dsl Projektu definiuje interfejs API dla linii DSL.DslPackage Projektu określa, w jaki sposób integruje się z Visual Studio.Można również dodać własne projekty, które mogą również zawierać kod generowany z modelu.

Bb286947.collapse_all(pl-pl,VS.110).gifKatalogi kodu

Większość kodu w każdym z tych projektów jest generowany na podstawie Dsl\DslDefinition.dsl.Wygenerowany kod znajduje się w Generated Code folder.Aby zobaczyć wygenerowany plik, kliknij przycisk [+] obok generowanie .tt pliku.

Zaleca się sprawdzenie wygenerowany kod, aby ułatwić zrozumienie DSL.Aby wyświetlić wygenerowane pliki, należy rozwinąć pliki *.tt w oknie Solution Explorer.

Pliki *.tt zawierają bardzo mało generowania kodu.Zamiast tego należy użyć <#include> dyrektyw, aby dołączyć pliki szablonu współużytkowanego.Pliki udostępnione można znaleźć w**\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates**

Podczas dodawania kodu programu do roztworu DSL, należy go dodać w oddzielnym pliku, poza folderów wygenerowany kod.Może zaistnieć potrzeba utworzenia Custom Code folder.(Podczas dodawania nowego pliku kodu do niestandardowego folderu, pamiętaj, aby poprawić obszaru nazw w szkielet następującym kodem początkowym.)

Zaleca się że nie edytować wygenerowany kod bezpośrednio, ponieważ zmiany zostaną utracone podczas odbudować roztworu.Zamiast tego aby dostosować linii DSL:

  • Dostosować wiele parametrów w definicji DSL.

  • Zapisywać w plikach osobnego kodu klasy częściowe override metod, które są zdefiniowane w lub dziedziczone przez klas generowanych.W niektórych przypadkach trzeba ustawić Generuje podwójne uzyskane opcji klasy w definicji DSL, aby być w stanie zastąpić metodę wygenerowany.

  • Ustaw opcje w definicji DSL, które powodują wygenerowany kod zapewnienie "haki" własnego kodu.

    Na przykład jeśli ustawisz Ma niestandardowy konstruktor opcji klasy domeny i następnie zbudować roztwór, są wyświetlane komunikaty o błędzie.Kliknij dwukrotnie jeden z tych komunikatów o błędach zobaczysz komentarze wygenerowany kod, które wyjaśniają, co powinno dostarczyć niestandardowego kodu.

  • Pisać własne szablony tekstu do generowania kodu konkretnej aplikacji.Możesz wykorzystania dołączyć pliki, aby udostępnić części szablonów, które są wspólne dla wielu projektów i można utworzyć Visual Studio szablonów do ustawiania projektów, które są inicjowane z strukturę pliku projektu.

Wygenerowane pliki w Dsl

Następujące pliki generowane są wyświetlane w Dsl projektu.

Nazwa pliku

Opis

YourDslSchema.xsd

Schemat dla plików zawierający wystąpień linii DSL.Ten plik jest kopiowany do kompilacji (bin) katalogu.Podczas instalowania linii DSL można skopiować ten plik do \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas , dzięki czemu można sprawdzić poprawność plików modelu.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań języka specyficzne dla domeny.

Jeśli dopasowujesz serializacji przez ustawienie opcji w programie Explorer DSL schemat zostanie zmieniona.Jednakże jeśli piszesz kodu serializacji tego pliku nie jest już może reprezentować rzeczywistego schematu.Aby uzyskać więcej informacji, zobacz Dostosowywanie pliku magazynu i serializacji XML.

ConnectionBuilders.cs

Konstruktor połączenia jest klasa, która tworzy relacje.Jest to kod związany z narzędzia połączenia.Ten plik zawiera pary klas dla każdego narzędzia połączenia.Ich nazwy są uzyskiwane z nazwy domeny narzędzie relacji i połączenia: relacjikonstruktora, i ConnectorToolConnectAction.

(W przykładzie składnik rozwiązanie jednego z konstruktorów połączenia nosi nazwę ConnectionBuilder, to zbieżność, ponieważ relacja domeny nosi nazwę połączenia).

Ta relacja jest utworzona w relacjiBuilder.Connect() metody.Wersja domyślna sprawdza, czy elementy modelu źródłowego i docelowego są akceptowane i następnie tworzy relację.Na przykład:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Każda klasa konstruktora jest generowany na podstawie węzła w Konstruktorzy połączenia sekcji w Eksploratorze DSL.Jeden Connect metody można tworzyć relacje między jedną lub więcej par klas domeny.Każda para jest zdefiniowany przez dyrektywy połączenia łącza, który można znaleźć w Eksploratorze DSL węźle konstruktora.

Można na przykład dodać do jednego połączenia konstruktora łącze Połącz dyrektyw, dla każdego z trzech typów relacji w próbce DSL.Dałoby to użytkownika za pomocą narzędzia do jednego połączenia.Typ relacji, których wystąpienia tworzone są zależą od typów elementów źródłowych i docelowych, wybrane przez użytkownika.Aby dodać łącze dyrektyw połączenia, kliknij prawym przyciskiem myszy konstruktora w Eksploratorze DSL.

Aby napisać kod niestandardowy, który jest uruchamiany, gdy jest tworzony określonego typu relacji domeny, zaznacz odpowiednie dyrektywy połączenia łącze w węźle konstruktora.W oknie dialogowym właściwości ustaw Niestandardowe korzysta z połączenia.Odbuduj roztworu, a następnie podaj kod wynikowy błędów.

Aby napisać kod niestandardowy, który jest uruchamiany w każdym przypadku, gdy użytkownik używa to narzędzie połączenia, należy ustawić Jest niestandardowy właściwość konstruktora połączenia.Można podać kod, który decyduje, czy element źródłowy jest dozwolone, czy określona kombinacja źródła i docelowych jest dozwolone, i jakie aktualizacje należy do modelu po nawiązaniu połączenia.Można na przykład zezwalania na połączenie tylko wtedy, gdy nie spowoduje utworzenia pętli na diagramie.Zamiast łącza pojedynczego relacji może utworzyć wystąpienia deseń bardziej złożonych z kilku elementów relację między źródłowym i docelowym.

Connectors.cs

Zawiera klasy dla łączników, które są zazwyczaj reprezentujące relacje odniesienia elementy diagramu.Każda klasa jest generowany na podstawie jednego łącznika w definicji DSL.Jest pochodną klasy co łącznikaBinaryLinkShape

Aby kolor i niektóre inne stylu Zmienna funkcje w czasie wykonywania, kliknij prawym przyciskiem myszy klasę na diagramie definicji DSL i wskaż Dodać narażonych.

Aby styl dodatkowe funkcje zmiennej w czasie wykonywania, zobacz na przykład TextField i ShapeElement.

Diagram.cs

Zawiera klasa, która definiuje diagramu.Wynika to z Diagram.

Aby kolor i niektóre inne stylu Zmienna funkcje w czasie wykonywania, kliknij prawym przyciskiem myszy klasę na diagramie definicji DSL i wskaż Dodać narażonych.

Ponadto, ten plik zawiera FixupDiagram regułę, która reaguje, gdy nowy element jest dodawany do modelu.Reguła jest dodawany nowy kształt i łączy kształt element modelu.

DirectiveProcessor.cs

Ten procesor dyrektywa pomaga użytkownikom zapisać szablony tekst odczytać instancję modem DSL.Dyrektywa procesor ładuje zestawy (dynamicznie dll) dla linii DSL i efektywnie wstawia using instrukcje dla obszaru nazw.Dzięki temu kod w szablonach tekstu do korzystania z klasy i relacje, które zostały zdefiniowane w linii DSL.

Aby uzyskać więcej informacji, zobacz Generowanie kodu w języku specyficzne dla domeny i Tworzenie niestandardowych T4 tekst szablonu dyrektywy procesorów.

DomainClasses.cs

Implementacje klasy domeny, które są zdefiniowane, łącznie z klasy abstrakcyjne i klasy modelu głównego.Pochodzą one z ModelElement.

Każda klasa domeny zawiera:

  • Definicja właściwości i klasy obsługi zagnieżdżone dla każdej właściwości domeny.Można zastąpić, OnValueChanging() i OnValueChanged().Aby uzyskać więcej informacji, zobacz Domen właściwość wartość zmiany obsługi.

    W przykładzie DSL Comment klasy zawiera właściwość Text i klasy obsługi TextPropertyHandler.

  • Akcesor właściwości relacji, w których uczestniczy klasy tej domeny.(Nie jest żadna z klas zagnieżdżonych dla właściwości roli).

    W przykładzie DSL Comment klasa ma akcesorów łączących się z jego nadrzędnego modelu za pomocą relacji osadzania ComponentModelHasComments.

  • Konstruktory.Jeśli chcesz zastąpić te Ma niestandardowy konstruktor w klasie domeny.

  • Element metody obsługi grupy prototyp (EPZ).Są one niezbędne, jeśli użytkownik może korespondencji seryjnej (Dodaj) inny element na wystąpienia tej klasy.Zazwyczaj użytkownik wykona to przeciągając narzędziem elementu lub innego kształtu lub wklejając.

    W przykładzie DSL, Input portu lub dane wyjściowe mogą być scalane na składnik.Ponadto składniki i komentarze mogą być scalane na modelu.W

    Metody obsługi EGP w klasie Component umożliwia składnik, aby zaakceptować portów, ale nie komentarze.Obsługa EGP klasy modelu głównego akceptuje komentarze i składników, ale nie portów.

DomainModel.cs

Klasa, która reprezentuje nazwę modelu domeny.Wynika to z DomainModel.

UwagaUwaga
Nie jest taka sama, jak klasa głównego modelu.

Kopiowanie i usuwanie zamknięcia zdefiniować, co inne elementy powinny być uwzględnione, gdy element jest kopiowany lub usuwany.To zachowanie można kontrolować, ustawiając Propaguje kopii i Propaguje usunąć właściwości ról na każdej stronie każdej relacji.Jeśli chcesz, aby wartości, które mają być określane dynamicznie, można napisać kod, aby zastąpić metody klas zamknięcia.Aby uzyskać więcej informacji, zobacz Jak: kopia programu i zachowanie Wklej - przekierowania.

DomainModelResx.resx

Ten element zawiera ciągi znaków, takie jak opis klas domeny i właściwości, nazwy właściwości, etykiety przybornik, błąd standardowy wiadomości i inne ciągi znaków, które mogą być wyświetlane dla użytkownika.Zawiera również narzędzie ikony i obrazów, kształtów obrazu.

Plik ten jest związany, do montażu zbudowany i zapewnia domyślne wartości tych zasobów.Przez utworzenie zestawu satelickiego, zawierający zlokalizowaną wersję zasoby można lokalizować linii DSL.Tej wersji będą używane, gdy modem DSL jest zainstalowany w kulturze, dobierając zasoby zlokalizowane.Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań języka specyficzne dla domeny.

DomainRelationships.cs

Każde łącze między dwoma elementami modelu jest reprezentowane przez instancję klasy relacji do domeny.Wszystkie klasy relacji są uzyskiwane z lElementLink, który z kolei wywodzi się z ModelElement.Ponieważ jest ModelElement, wystąpienie relacji może mieć właściwości i może być źródłowego lub docelowego relacji.

HelpKeywordHelper.cs

Zawiera funkcje, które są używane, gdy użytkownik nacionie klawisz F1.

MultiplicityValidation.cs

W role w relacji gdzie określić liczebność 1..1 lub 1.. *, użytkownik zostanie ostrzeżony że co najmniej jedno wystąpienie relacji jest wymagany.Plik ten zawiera ograniczeń sprawdzania poprawności, które implementują te ostrzeżenia.Łącze 1..1 do osadzania obiektu nadrzędnego nie został zweryfikowany.

Dla ograniczenia te mają być wykonane, musi być zainstalowany jeden z używa... opcje w Editor\Validation węzeł w Eksploratorze DSL.Aby uzyskać więcej informacji, zobacz Sprawdzanie poprawności w języku specyficzne dla domeny.

PropertiesGrid.cs

Ten plik zawiera kod, tylko wtedy, gdy zostały podłączone deskryptora typu niestandardowe właściwości domeny.Aby uzyskać więcej informacji, zobacz Dostosowywanie okna właściwości.

SerializationHelper.cs

  • Metoda sprawdzania poprawności, aby zapewnić, że nie dwa elementy odwołuje się tym samym monikera.Aby uzyskać więcej informacji, zobacz Dostosowywanie pliku magazynu i serializacji XML.

  • Klasa SerializationHelper zawiera funkcje, które są używane wspólnie przez klasy serializacji.

Serializer.cs

Klasę serializator dla każdej klasy domeny, relacji, kształt, łącznika, diagramu i modelu.

Wiele funkcji tych klas można kontrolować za pomocą ustawień w programie Explorer DSL pod Zachowanie serializacji Xml.

Shapes.cs

Klasa dla każdej klasy shape w definicji DSL.Kształty są pochodnymi NodeShape.Aby uzyskać więcej informacji, zobacz Dostosowywanie pliku magazynu i serializacji XML.

Aby zastąpić wygenerowanej metody z własnych metod w klasie częściowe, należy ustawić Generuje podwójne uzyskane dla łącznika w definicji DSL.Aby zastąpić Konstruktor własny kod, ustawić Ma niestandardowy konstruktor.

Aby kolor i niektóre inne stylu Zmienna funkcje w czasie wykonywania, kliknij prawym przyciskiem myszy klasę na diagramie definicji DSL i wskaż Dodać narażonych.

Aby styl dodatkowe funkcje zmiennej w czasie wykonywania, zobacz na przykład TextField iShapeElement

ToolboxHelper.cs

Konfiguruje przybornik, instalując element grupy prototypów do narzędzia elementu.Kopie te prototypy są scalane z elementów docelowych, gdy użytkownik uruchomi narzędzie.

Można zastąpić CreateElementPrototype() do definiowania element przybornika, który tworzy grupę kilka obiektów.Na przykład można zdefiniować element do reprezentowania obiektów, które mają pełnotekstowe.Po zmianie kodu, należy zresetować doświadczalnych wystąpienie Visual Studio , aby wyczyścić pamięć podręczną przybornika.

Wygenerowane pliki w programie project DslPackage

DslPackage pary model DSL, aby Visual Studio powłoki zarządzania poleceń okna, przybornik i menu.Większość klas jest podwójne uzyskane, tak, aby przesłonić dowolne ich metod.

Nazwa pliku

Opis

CommandSet.cs

Poleceń menu kontekstowego, które są widoczne na diagramie.Można dostosować lub dodać do tego zestawu.Ten plik zawiera kod dla poleceń.Lokalizacja poleceń menu jest określana przez plik Commands.vsct.Aby uzyskać więcej informacji, zobacz Zapisywanie poleceń użytkownika i działania.

Constants.cs

Identyfikatory GUID.

DocData.cs

YourDslDocData zarządza załadunku i zapisanie pliku modelu i tworzy wystąpienie magazynu.

Na przykład, jeśli chcesz zapisać modem DSL w bazie danych, zamiast pliku, można zastąpić Load i Save metody.

DocView.cs

YourDslDocView zarządza okna, w której znajduje się diagram.Na przykład można osadzić diagramu wewnątrz okien formularza:

Dodaj plik formantu użytkownika do projektu DslPackage.Dodawanie panelu, w którym mogą być wyświetlane diagramu.Dodawanie przycisków i innych formantów.W widoku Kod formularza dodaj następujący kod, dostosowując nazw do linii 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

Tworzy DocData i DocView.Spełnia on normy interfejs, który Visual Studio korzysta, aby otworzyć Edytor, podczas uruchamiania pakietu DSL.Odwołuje się w ProvideEditorFactory atrybutu w Package.cs

GeneratedVSCT.vsct

Lokalizuje standardowych poleceń menu, takich jak menu kontekstowego diagram Edytuj menu i tak dalej.Kod dla poleceń znajduje się w CommandSet.cs.Można przenieść lub modyfikować standardowe polecenia i można dodać swoje własne polecenia.Aby uzyskać więcej informacji, zobacz Zapisywanie poleceń użytkownika i działania.

ModelExplorer.cs

Definiuje Eksploratora modelu dla linii DSL.Jest to widok drzewa modelu, który użytkownik widzi obok diagramu.

Na przykład, można zastąpić InsertTreeView() Aby zmienić kolejność wyświetlania elementów w Eksploratorze modelu.

Zaznaczenia w Eksploratorze modelu, aby zachować zsynchronizowane z wyborem diagram, może użyć następującego kodu:

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

Definiuje okno, w którym jest wyświetlany Eksploratora modelu.Uchwyty zaznaczenia elementów w Eksploratorze.

Package.cs

Ten plik definiuje, jak modem DSL integruje Visual Studio.Atrybuty klasy pakietu zarejestrować DSL jako programu obsługi plików, które rozszerzeniem pliku, zdefiniowanie jej przybornika i definiują sposób otworzyć nowe okno.Metoda Initialize() jest wywoływana jeden raz podczas pierwszego DSL jest ładowany do Visual Studio instancji.

Source.Extension.vsixmanifest

Aby dostosować ten plik, należy edytować .tt pliku.

Informacje dotyczące przestrogiPrzestroga
Jeśli edytujesz plik .tt zasoby, takie jak ikony lub obrazy, upewnij się, że zasób jest włączone w kompilacji VSIX.W oknie Solution Explorer wybierz plik i upewnij się, że Dołącz VSIX jest właściwość True.

Plik ten kontroluje, w jaki sposób modem DSL jest spakowany w Visual Studio Integration Extension (VSIX).Aby uzyskać więcej informacji, zobacz Wdrażanie rozwiązań języka specyficzne dla domeny.

Zobacz też

Koncepcje

Jak definiować języka specyficzne dla domeny

Zrozumienia modeli, klasy i relacje

Dostosowywanie i rozszerzanie języka specyficzne dla domeny

Inne zasoby

Pisanie kodu, aby dostosować język specyficzne dla domeny