Condividi tramite


Informazioni sul codice DSL

Una soluzione (DSL) di linguaggio specifico di dominio genera un'api in cui è possibile utilizzare per leggere e aggiornare le istanze del linguaggio DSL Visual Studio.Questa API è definito nel codice generato dalla definizione di modello DSL.In questo argomento viene descritta l'API generato.

la soluzione di esempio: Diagrammi componente

Per creare la soluzione che è l'origine della maggior parte degli esempi di questo argomento, creare un modello DSL da modelli componenti modello della soluzione.Si tratta di uno dei modelli standard visualizzato quando si crea una nuova soluzione DSL.

[!NOTA]

Il modello DSL i diagrammi componente non è correlato ai diagrammi componente UML cui è possibile creare tramite il menu nell'architettura Visual Studio Ultimate.in nuovo progetto la finestra di dialogo espandere, altri tipi di progetto \Extensibility quindi scegliere Finestra di progettazione del linguaggio specifico di dominio.

Premere F5 e sperimentato, se non si ha familiarità con il modello della soluzione.Si noti in particolare create le porte trascinando uno strumento della porta su un componente e che è possibile connettere le porte.

Progetti e porte interconnesse

La struttura della soluzione DSL

Dsl il progetto definisce API per il linguaggio DSL.DslPackage il progetto definisce integrazione con Visual Studio.È possibile aggiungere anche per altri progetti, che possono inoltre contenere codice generato dal modello.

Bb286947.collapse_all(it-it,VS.110).gifle directory di codice

La maggior parte del codice in ognuno di questi progetti è generato da Dsl\DslDefinition.dsl.il codice generato è in Generated Code cartella.Per visualizzare un file generato, fare clic su [+] accanto alla generazione .tt file.

Si consiglia di verificare il codice generato per comprendere il modello DSL.Per visualizzare i file generati, espandere i file in Esplora Risorse di *.tt.

I file di *.tt contengono minimo che genera il codice.invece, utilizzano <#include> le direttive da includere condivisi i file di modello.I file condivisi sono disponibili in \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates

Quando si aggiunge il codice programma alla soluzione DSL, aggiungerla in un file separato, fuori della cartella codice generato.È possibile creare un oggetto Custom Code cartella.(Quando si aggiunge un nuovo file di codice a una cartella personalizzata, è necessario risolvere lo spazio dei nomi nello scheletro iniziale di codice.)

È consigliabile non modificare direttamente il codice generato, poiché le modifiche andranno perse quando si ricompila la soluzione.Invece, personalizzare il modello DSL:

  • Regolare dei parametri nella definizione di modello DSL.

  • Scrivere le classi parziali nei file di codice separati, ai metodi di override definiti in, o ereditato da, le classi generate.In alcuni casi, è necessario impostare genera il doppio derivato opzione di classe nella definizione di modello DSL, per poter eseguire l'override di un metodo generato.

  • Impostare le opzioni nella definizione di modello DSL che bloccano il codice generato per fornire “hook„ per il codice.

    Ad esempio, se si imposta Un costruttore personalizzato l'opzione di una classe di dominio e quindi compila la soluzione, verranno i messaggi di errore.Quando si fa doppio clic su uno di questi messaggi di errore, verranno visualizzati i commenti nel codice generato che spiegano quanto il codice personalizzato deve fornire.

  • Scrivere possiedono i modelli di testo per generare codice specifico all'applicazione.È possibile utilizzare file di inclusione per condividere parti dei modelli comuni a molti progetti e è possibile creare Visual Studio modelli dei progetti di installazione che vengono inizializzati con diventi proprietaria della struttura di file.

File generati nel Dsl

I seguenti file compilati vengono visualizzati in Dsl progetto.

Nome file

Descrizione

TheDslSchema.xsd

Lo schema dei file che contiene le istanze del linguaggio DSL.Questo file viene copiato nella compilazione (bin) directory.Quando si installa il modello DSL, è possibile copiare questo file in \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas in modo che sia possibile convalidare i file di modello.Per ulteriori informazioni, vedere Distribuzione di soluzioni per un linguaggio specifico di dominio.

Se si personalizza la serializzazione impostando le opzioni nel modello DSL Esplora Risorse, lo schema verrà modificato di conseguenza.Tuttavia, se si scrive del codice di serializzazione, questo file può più non rappresentare effettivo schema.Per ulteriori informazioni, vedere Personalizzazione dell'archiviazione dei file e della serializzazione XML.

ConnectionBuilders.cs

Un generatore di connessione è una classe che crea relazioni.È il code-behind di uno strumento della connessione.Questo file contiene una coppia di classi per ogni strumento della connessione.I nomi sono derivati dai nomi dello strumento di connessione e di relazione di dominio: relazionegeneratore e ConnectorToolConnectAction.

Nell'esempio parte della soluzione, uno dei generatori della connessione viene chiamato ConnectionBuilder, si tratta di una coincidenza, poiché la relazione di dominio è denominata Connection).

La relazione viene creata in relazioneBuilder.Connect() metodo.La versione predefinita di verificare che gli elementi del modello di destinazione e di origine siano accettabili e quindi creata un'istanza della relazione.Di seguito è riportato un esempio:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Ogni classe del generatore viene generata da un nodo in Generatori di connessione sezione del linguaggio DSL Esplora Risorse.uno Connect il metodo può creare relazioni tra una o più coppie di classi di dominio.Ognuna delle quali è definita da un collegamento connette la direttiva, che è possibile trovare nel modello DSL Esplora Soluzioni nel nodo del generatore.

Ad esempio, è possibile aggiungere a un generatore di connessione il collegamento connettere le direttive per ciascuno dei tre tipi di relazioni nell'esempio DSL.Ciò fornisce all'utente con un unico strumento della connessione.Il tipo di relazione creare un'istanza dipenderebbe dai tipi di elementi di origine e di destinazione selezionati dall'utente.Per aggiungere il collegamento connettere le direttive, fare clic con il pulsante destro del mouse su un generatore nel modello DSL Esplora Risorse.

Per scrivere codice personalizzato che viene eseguito quando uno specifico tipo di relazione di dominio viene creato, selezionare il collegamento appropriato connettono la direttiva nel nodo del generatore.Nella Finestra Proprietà, impostare L'oggetto personalizzato di utilizzo si connette.Ricompilare la soluzione e quindi fornire codice per correggere gli errori risultanti.

Per scrivere codice personalizzato che viene eseguito ogni volta che l'utente utilizza lo strumento della connessione, impostare Viene personalizzato proprietà generatore di connessione.È possibile fornire codice che decide se un elemento di origine è valido, se una combinazione specifica di origine e di destinazione è valida e ciò che aggiorna deve essere effettuata al modello quando una connessione è stata eseguita.Ad esempio, è possibile consentire una connessione solo se non crei un ciclo nel diagramma.Invece di un singolo collegamento di relazione, è possibile creare un'istanza di un modello più complesso di vari elementi correlati tra origine e destinazione.

Connectors.cs

Contiene le classi per i connettori, ovvero gli elementi del diagramma che in genere rappresentano le relazioni di riferimento.Ogni classe viene generata da un connettore nella definizione di modello DSL.Ogni classe del connettore deriva da BinaryLinkShape

Per fare in modo che il colore e un'altra variabile di funzionalità di stile in fase di esecuzione, fare clic con il pulsante destro del mouse sulla classe nel diagramma della definizione di modello DSL e indicare aggiungere esposto.

Per impostare la variabile di funzionalità aggiuntive di stile in fase di esecuzione, vedere ad esempio TextField e ShapeElement.

Diagram.cs

contiene la classe che definisce il diagramma.Deriva da Diagram.

Per fare in modo che il colore e un'altra variabile di funzionalità di stile in fase di esecuzione, fare clic con il pulsante destro del mouse sulla classe nel diagramma della definizione di modello DSL e indicare aggiungere esposto.

inoltre, questo file contiene FixupDiagram la regola, che risponda quando un nuovo elemento viene aggiunto al modello.La regola viene aggiunta una nuova forma e collega la forma all'elemento del modello.

DirectiveProcessor.cs

Questo processore di direttiva consente agli utenti di scrivere modelli di testo che fanno riferimento a un'istanza del modello DSL.Il processore di direttiva carica gli assembly (DLL) per il linguaggio DSL ed efficace i comandi using istruzioni per lo spazio dei nomi.Ciò consente al codice nei modelli di testo utilizzate le classi e le relazioni che sia definito nel modello DSL.

Per ulteriori informazioni, vedere Generazione di codice da un linguaggio specifico di dominio e Creazione di processori di direttiva di modelli di testo T4 personalizzati.

DomainClasses.cs

Implementazioni di classi di dominio che definito, incluse le classi astratte e la classe della radice del modello.Derivano da ModelElement.

ogni classe di dominio contiene:

  • Una definizione di proprietà e un gestore annidato classe per ogni proprietà del dominio.È possibile eseguire l'override di OnValueChanging() e OnValueChanged().Per ulteriori informazioni, vedere Gestori di modifica del valore delle proprietà del dominio.

    Nell'esempio DSL, Comment la classe contiene una proprietà Text e una classe del gestore TextPropertyHandler.

  • Proprietà di accesso per le relazioni a cui questa classe di dominio partecipa.(Nessuna classe annidata per le proprietà del ruolo.)

    Nell'esempio DSL, Comment la classe dispone di funzioni di accesso che accedono al relativo modello del padre con la relazione includendo ComponentModelHasComments.

  • costruttori.Se si desidera eseguire l'override di questi, impostare Un costruttore personalizzato nella classe di dominio.

  • Metodi del gestore del (EGP) prototipo del gruppo di elementi.questi sono necessari se l'utente può unione (aggiungi) un altro elemento istanze di questa classe.In genere si esegue il trascinamento da uno strumento o da un altro elemento forma, o incollando.

    Nell'esempio DSL, un punto d'ingresso o una porta di output può essere estesa in un componente.Inoltre, i componenti e i commenti possono essere unite nel modello.L'attributo

    I metodi del gestore di EGP nella classe Component consentono di un componente accetta le porte, ma non i commenti.Il gestore di EGP nella classe di modello radice accetta i commenti e i componenti, ma non le porte.

DomainModel.cs

la classe che rappresenta il modello di dominio.Deriva da DomainModel.

NotaNota
Ciò non corrisponde alla classe radice del modello.

Le chiusure di eliminazione di copia e definiscono quali altri elementi devono essere inclusi quando un elemento viene copiato o eliminato.È possibile controllare questo comportamento impostando copia di propagazioni e Eliminazione di propagazioni proprietà dei ruoli su ciascun lato di ogni relazione.Se si desidera dinamicamente valori da determinare, è possibile scrivere codice per eseguire l'override dei metodi delle classi di chiusura.Per ulteriori informazioni, vedere Procedura: programmare il comportamento della funzione Copia e incolla (reindirizzamento).

DomainModelResx.resx

Questo file contiene le stringhe come le descrizioni delle classi di dominio e proprietà, nomi delle proprietà, etichette della casella degli strumenti, messaggi di errore standard e altre stringhe che possono essere visualizzati.Contiene inoltre le icone e le immagini degli strumenti per le forme di immagine.

Questo file è associato nell'assembly generato e fornisce valori predefiniti delle risorse.È possibile localizzare il modello DSL creare un assembly satellite contenente una versione localizzata di risorse.Tale versione verrà utilizzata quando il modello DSL è installato nelle impostazioni cultura che corrispondono alle risorse localizzate.Per ulteriori informazioni, vedere Distribuzione di soluzioni per un linguaggio specifico di dominio.

DomainRelationships.cs

Ogni collegamento tra due elementi in un modello è rappresentato da un'istanza di una classe di relazione di dominio.Tutte le classi di relazioni che derivano da lElementLink, che a sua volta deriva da ModelElement.Poiché è un ModelElement, un'istanza di una relazione può disporre di proprietà e può essere l'origine o la destinazione di una relazione.

HelpKeywordHelper.cs

Fornisce funzioni utilizzate quando l'utente preme F1.

MultiplicityValidation.cs

I ruoli di relazione di specificare una molteplicità di 1..1 o 1. *, deve ricevere un avviso che almeno un'istanza di una relazione è obbligatoria.Questo file fornisce i vincoli di convalida che implementano tali avvisi.Il collegamento 1..1 a un elemento padre l'inserimento non è verificato.

Per questi vincoli essere eseguiti, è necessario istallare uno di utilizza… opzioni in editor \Validation nodo nel modello DSL Esplora Risorse.Per ulteriori informazioni, vedere Convalida in un linguaggio specifico di dominio.

PropertiesGrid.cs

Questo file contiene il codice solo se è stato associato un descrittore di tipo personalizzato a una proprietà del dominio.Per ulteriori informazioni, vedere Personalizzazione della finestra Proprietà.

SerializationHelper.cs

Serializer.cs

Una classe di serializzazione per ogni classe di dominio, relazione, la forma, connettore, diagramma e modello.

Molte delle funzionalità di queste classi possono essere controllate dalle impostazioni nel modello DSL Esplora Soluzioni sotto comportamento di serializzazione XML.

Shapes.cs

Classe per ogni classe di forma nella definizione di modello DSL.Le forme che derivano da NodeShape.Per ulteriori informazioni, vedere Personalizzazione dell'archiviazione dei file e della serializzazione XML.

Per eseguire l'override dei metodi generati con per contenere i metodi in una classe parziale, set genera il doppio derivato per il connettore nella definizione di modello DSL.Per sostituire un costruttore con il proprio codice, set Un costruttore personalizzato.

Per fare in modo che il colore e un'altra variabile di funzionalità di stile in fase di esecuzione, fare clic con il pulsante destro del mouse sulla classe nel diagramma della definizione di modello DSL e indicare aggiungere esposto.

Per impostare la variabile di funzionalità aggiuntive di stile in fase di esecuzione, vedere ad esempio TextField e ShapeElement

ToolboxHelper.cs

Configura la casella degli strumenti installando i prototipi del gruppo di elementi negli strumenti dell'elemento.Le copie dei prototipi sono unite agli elementi di destinazione quando l'utente esegue lo strumento.

È possibile eseguire l'override CreateElementPrototype() per definire un elemento della casella degli strumenti che crea un gruppo di diversi oggetti.Ad esempio, è possibile definire un elemento per rappresentare oggetti che hanno sottocomponenti.Dopo avere modificato il codice, reimpostare istanza sperimentale di Visual Studio per cancellare la cache della casella degli strumenti.

File generati nel progetto DslPackage

DslPackage accoppia il modello DSL a Visual Studio la shell, mantenimento della finestra, nella casella degli strumenti e i comandi di menu.La maggior parte delle classi sono doppio derivato, in modo che sia possibile eseguire l'override di tutti i relativi metodi.

Nome file

Descrizione

CommandSet.cs

I comandi del menu di scelta rapida che sono visibili nel diagramma.È possibile adattare o aggiungere a questo gruppo.Questo file contiene il codice per i controlli.La posizione dei comandi dei menu è determinata dal file di Commands.vsct.Per ulteriori informazioni, vedere Scrittura di azioni e comandi utente.

Constants.cs

GUID.

DocData.cs

TheDslDocData gestisce il caricamento e il salvataggio di un modello per archiviare e crea l'istanza dell'archivio.

Ad esempio, se si desidera salvare il modello DSL in un database anziché un file, è possibile eseguire l'override Load e Save metodi.

DocView.cs

TheDslDocView gestisce la finestra in cui il diagramma viene visualizzato.Ad esempio, è possibile includere il diagramma in un windows form:

Aggiungere un file di controllo utente al progetto DslPackage.Aggiungere un pannello in cui il diagramma può essere visualizzato.Per aggiungere pulsanti e altri controlli.Nella visualizzazione codice del form, aggiungere il codice seguente, regolante i nomi al modello 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

creare un'istanza DocData e DocView.Svolge un'interfaccia standard quello Visual Studio utilizza aprire un editor quando il pacchetto DSL è attivato.Viene fatto riferimento in ProvideEditorFactory attributo in Package.cs

GeneratedVSCT.vsct

Individua i comandi di menu standard nei menu, ad esempio il menu di scelta rapida del diagramma, modifica menu, e così via.Il codice dei controlli è in CommandSet.cs.È possibile riassegnare o modificare i controlli standard e aggiungere per contenere i controlli.Per ulteriori informazioni, vedere Scrittura di azioni e comandi utente.

ModelExplorer.cs

Definisce Esplora Risorse di template per il linguaggio DSL.Si tratta della visualizzazione struttura ad albero del modello che riceverà accanto al diagramma.

Ad esempio, è possibile eseguire l'override InsertTreeView() per modificare l'ordine in cui gli elementi vengono visualizzati in Esplora Risorse di modello.

Se si desidera che la selezione nell'esploratore di modello per mantenere sincronizzato con la selezione del diagramma, è possibile utilizzare il codice seguente:

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

Definisce la finestra in cui in esplora modelli scegliere da modello di visualizzazione.Gestisce la selezione degli elementi nell'esploratore.

Package.cs

Questo file definisce in modo il modello DSL integra Visual Studio.Attributi del log di classe del pacchetto di DSL come gestore per i file che presentano l'estensione di file, definire la casella degli strumenti e definiscono come aprire una nuova finestra.Il metodo di Initialize() viene chiamato una volta in cui il primo modello DSL è caricato in un oggetto Visual Studio istanza.

Source.extension.vsixmanifest

per personalizzare questo file, modificare .tt file.

Nota di avvisoAttenzione
Se si modifica il file .tt per includere risorse quali icone o immagini, assicurarsi che la risorsa sia inclusa nella compilazione VSIX.In Esplora soluzioni, selezionare il file e verificare che Importare in VSIX la proprietà è True.

Comandi del file come il modello DSL è compresso in un progetto VSIX (Visual Studio integration extension).Per ulteriori informazioni, vedere Distribuzione di soluzioni per un linguaggio specifico di dominio.

Vedere anche

Concetti

Procedura: definire un linguaggio specifico di dominio

Informazioni su modelli, classi e relazioni

Personalizzazione ed estensione di un linguaggio specifico di dominio

Altre risorse

Scrittura di codice per personalizzare un linguaggio specifico di dominio