次の方法で共有


DSL コードについて

ドメイン固有言語の (DSL) ソリューションは Visual Studio の DSL のインスタンスを読み取って更新するために使用できる API が生成されます。この API はDSL 定義から生成されたコードで定義されます。このトピックでは生成された API について説明します。

ソリューションの例 : コンポーネント図

このトピックの例のほとんどのソースであるソリューションを作成するには***** Component Models ***** のソリューション テンプレートから DSL を作成します。これは新しい DSL のソリューションを作成するときに表示される標準テンプレートの 1 つです。

[!メモ]

コンポーネント図の DSL のテンプレートはUML コンポーネント図と Visual Studio Ultimate にアーキテクチャのメニューを使用して作成できる関係ありません。[入力] ENT0ENT ダイアログ ボックスでENT1ENT を展開し次に [ENT3ENT] をクリックします。

このソリューション テンプレートの詳細についてはF5 キーを押しての実験します。作成されコンポーネントのポートのツールをドラッグしてポートをポートを接続できるよう特にに注意してください。

コンポーネントおよび相互接続ポート

DSL のソリューションの構造

Dsl のプロジェクトではDSL の API を定義します。DslPackage のプロジェクトは Visual Studio との統合方法を定義します。またモデルから生成されたコードを格納する独自のプロジェクトを追加できます。

Bb286947.collapse_all(ja-jp,VS.110).gifコード ディレクトリ

これらのプロジェクトのコードのほとんどはDsl\DslDefinition.dsl から生成されます。生成されたコードは Generated Code フォルダーにあります。生成されたファイルを表示するには**.tt** 生成のファイルの隣に ENT4ENT [] をクリックします。

また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 定義のパラメーターを調整します。

  • 定義されているまたは継承されている生成されたクラスを作成してメソッドをオーバーライドする個別のコード ファイルの部分クラスを実行します。場合によっては生成されたメソッドをオーバーライドするにはDSL を定義するクラスの ENT0ENT [入力] オプションを設定する必要があります。

  • 生成されたコードが 「独自のコードのフックがあります。DSL 定義のオプションを設定します。

    たとえばドメイン クラス ENT0ENT [入力] オプションを設定しソリューション" エラー メッセージを作成します。これらのエラー メッセージの 1 個の各ダブル クリックするとカスタム コードの内容を示す提供する生成されたコード内のコメントを参照してください。

  • アプリケーションに固有のコードを生成する独自のテキスト テンプレートを記述します。含まれている多くのプロジェクトに共通する独自のファイル構造体と初期化プロジェクトを設定するに Visual Studio プロジェクト テンプレートを作成してテンプレートの一部を共有するファイルを使用します。

Dsl の生成されたファイル

次の生成されたファイルは Dsl のプロジェクトに反映されます。

ファイル名

Description

YourDslSchema.xsd

DSL のインスタンスを含むファイルのスキーマ。このファイルはコンパイル bin() にコピーします。DSL をインストールするとモデル ファイルを検証するために \Program Files\Microsoft Visual Studio 11.0\Xml\Schemasこのファイルをコピーできます。詳細については、「ドメイン固有言語ソリューションの配置」を参照してください。

DSL のエクスプローラーでオプションを設定するとシリアル化をカスタマイズする場合はスキーマはそれに応じて変更します。ただし独自のシリアル化コードを記述する場合はこのファイルは実際のスキーマを表す場合があります。詳細については、「ファイル格納処理および XML シリアル化処理のカスタマイズ」を参照してください。

ConnectionBuilders.cs

接続ビルダーはリレーションシップを作成するクラスです。これは接続ツールのコードです。このファイルは各接続ツールのクラスのペアが含まれます。名前はドメイン リレーションシップと接続のツールの名前から派生します : リレーションシップ ビルダーConnectorToolConnectAction。

(構成のソリューションの例では接続ビルダーの 1 つがドメイン リレーションシップが Connection というためConnectionBuilder とこれが発生して呼ばれます)。

リレーションシップは リレーションシップ Builder.Connect() のメソッドで作成されます。既定のバージョンはソース モデルとターゲット モデル要素が許容範囲にあることを確認しリレーションシップをインスタンス化します。次に例を示します。

CommentReferencesSubject(sourceAccepted, targetAccepted);

各ビルダー クラスではDSL エクスプローラーの [ENT3ENT] セクションのノードから生成されます。Connect の 1 とおりの方法はドメイン クラスの一つ以上のペアの関係を作成できます。各ペアはビルダー] ノードの下に DSL のエクスプローラーで検索できるリンクの接続のディレクティブによって定義されます。

たとえばサンプル DSL には 3 種類の関係の接続数を 1 のビルダーへの接続のディレクティブに追加できます。これは接続のツールをユーザーに提供できます。インスタンス化されたリレーションシップの種類は選択したソースとターゲットの要素の種類によって異なります。リンクの接続のディレクティブを追加するにはDSL のエクスプローラー ビルダーを右クリックします。

にドメイン リレーションシップの種類を作成するときに実行するカスタム コードを記述するにはビルダーのノードの下にあるリンクの接続の適切なディレクティブを選択します。[プロパティ] ウィンドウで*** Uses Custom Connect *** を設定します。ソリューションをビルドし直し次に発生したエラーを修正するコードを指定します。

ユーザーがこの接続のツールを使用するときに実行するカスタム コードを記述する場合は接続 ENT3ENT ビルダーの [] プロパティを設定します。接続時に更新する場合にソース モデルとターゲットの特定の組み合わせを割り当てると成功するかどうかをソース要素を許可するかどうかを決定するコードを記述できます。たとえばダイアグラムのループを作成できなかった場合にのみ接続を許可する可能性があります。単一の関係のリンクではなくソースとターゲット間の関連付けられている要素のより複雑なパターンをインスタンス化できます。

Connectors.cs

通常は参照の関係を表すダイアグラム要素であるコネクタのクラスが含まれています。各クラスはDSL 定義の 1 とおりの形式から生成されます。いるコネクタのクラスはから派生します BinaryLinkShape

色およびそのほかの機能にするには変数の実行時にスタイルを定義しユース ケース図でクラスを右クリックしを *** Add Exposed *** をポイントします。

実行時に追加スタイルの特徴変数を使用するにはTextField たとえばShapeElement を参照してください。

Diagram.cs

図を定義するクラスが含まれています。これは、Diagramから派生します。

色およびそのほかの機能にするには変数の実行時にスタイルを定義しユース ケース図でクラスを右クリックしを *** Add Exposed *** をポイントします。

またこのファイルは新しい要素がモデルに追加されたときに応答 FixupDiagram の規則が含まれます。規則は新しい図形を追加しモデル要素に図形をリンクします。

DirectiveProcessor.cs

このディレクティブ プロセッサはユーザーが DSL のインスタンスを読み取るテキスト テンプレートを作成できます。ディレクティブ プロセッサはDSL のアセンブリ (DLL) を読み込んで名前空間の using のステートメントを挿入します。DSLで定義したリレーションシップとここではテキスト テンプレートのコードがクラスを使用できるようになります。

詳細については、「ドメイン固有言語からのコード生成」および「カスタム T4 テキスト テンプレート ディレクティブ プロセッサの作成」を参照してください。

DomainClasses.cs

ユーザーが定義した抽象クラスとモデル ルートのクラスを含むドメイン クラスの実装。これらは ModelElement から派生します。

各ドメイン クラスが含まれています :

  • プロパティの定義と入れ子になったハンドラーは各ドメインのプロパティについて説明します。OnValueChanging () と OnValueChanged をオーバーライドできます ()。詳細については、「ドメイン プロパティ値変更ハンドラー」を参照してください。

    DSL の例ではComment クラスはプロパティ Text とハンドラー TextPropertyHandler クラスが含まれています。

  • このクラスが含まれるドメイン リレーションシップのアクセサープロパティ。(プロパティのロールの入れ子になったクラスがありません)。

    DSL の例ではComment のクラスに埋め込む関係 ComponentModelHasComments して親モデルをアクセスアクセサーがあります。

  • コンストラクター。これらをオーバーライドする場合はドメイン クラス *** Has Custom Constructor *** を設定します。

  • 要素のグループのプロトタイプの (EGP) メソッド ハンドラー。ユーザーはこれら (追加) はこのクラスのインスタンスに別の要素を マージ する必要があります。通常ユーザーは要素のツールまたは別の図形ドラッグまたは貼り付けによってこれを実現します。

    DSL の例では投入口または出力ポートをコンポーネントに結合できます。またコンポーネントとコメントがモデルにマージできます。

    コンポーネント クラスの EGP のハンドラー メソッドではコンポーネントはコメントがポートを受け取ることができます。ルート モデルのクラスの EGP ハンドラーはコメントおよびコンポーネントポートを受け取ります。

DomainModel.cs

ドメイン モデルを表すクラスです。これは、DomainModelから派生します。

メモメモ
これはモデルのルートに同じクラスではありません。

要素がコピーまたは削除されると他の要素を含める必要がある内容をコピーおよび削除のクロージャは定義します。すべてのリレーションシップの両側のロールの *** Propagates Copy ****** Propagates Delete *** のプロパティを設定することでこの動作を制御できます。値に動的に決定するクロージャのクラスのメソッドをオーバーライドするコードを記述できます。詳細については、「方法: プログラムのコピー動作および貼り付け動作 - リダイレクト」を参照してください。

DomainModelResx.resx

これはドメイン クラスの説明など文字列プロパティプロパティ名ツールボックスのラベル標準エラー メッセージをユーザーに表示できる他の文字列です。またイメージの図形のツール アイコンとイメージが含まれています。

このファイルはビルドされたアセンブリにバインドされこれらのリソースの既定値を指定します。リソースのローカライズ バージョンを含むサテライト アセンブリを作成することでDSL をローカライズできます。このバージョンはDSL がローカライズされたリソースに一致するカルチャにインストールされるときに使用されます。詳細については、「ドメイン固有言語ソリューションの配置」を参照してください。

DomainRelationships.cs

モデルの 2 個の各要素間のリンクはドメイン リレーションシップのクラスのインスタンスによって表されます。すべての関係 lElementLink クラスはから派生します ModelElement から派生します。これは ModelElement であるためリレーションシップのインスタンスはプロパティがありリレーションシップのソースまたはターゲットに指定できます。

HelpKeywordHelper.cs

ユーザーがキーを押したときに使用される関数を指定します。

MultiplicityValidation.cs

1..1 または 1. * の多重度を指定するロール間の関係でリレーションシップの 1 文字以上のインスタンスが必要となるユーザーに警告する必要があります。このファイルの警告を実行する検証制約を提供します。埋め込み親ウィンドウへの 1..1 リンクは検証されません。

実行するこれらの制約に DSL エクスプローラーの [ENT1ENT] ノードの *** Uses... *** のオプション セット 1 が必要です。詳細については、「ドメイン固有言語における検証」を参照してください。

PropertiesGrid.cs

このファイルはドメインのプロパティにカスタム型記述子をアタッチしたときにのみコードが含まれています。詳細については、「プロパティ ウィンドウのカスタマイズ」を参照してください。

SerializationHelper.cs

Serializer.cs

各ドメイン クラスリレーションシップ形状コネクタ図とモデルのシリアライザーのクラス。

これらのクラスの機能の多くは *** Xml Serialization Behavior *** の下の DSL のエクスプローラーの設定によって制御できます。

Shapes.cs

DSL 定義のすべての図形クラスのクラス。図形は NodeShape から派生します。詳細については、「ファイル格納処理および XML シリアル化処理のカスタマイズ」を参照してください。

部分クラスに独自のメソッドの生成されたメソッドをオーバーライドするにはDSL 定義のコネクタの *** Generates Double Derived *** を設定します。独自のコードとコンストラクターを置き換えるには*** Has Custom Constructor *** を設定します。

色およびそのほかの機能にするには変数の実行時にスタイルを定義しユース ケース図でクラスを右クリックしを *** Add Exposed *** をポイントします。

実行時に追加スタイルの特徴変数を使用するにはTextField たとえばShapeElement を参照してください。

ToolboxHelper.cs

要素が要素のグループのプロトタイプをインストールするにはツールボックスを設定します。これらのプロトタイプのコピーはターゲット要素はユーザーがツールを実行するときにマージされます。

複数のオブジェクトのグループを作成するにはツールボックス項目を定義するに CreateElementPrototype() をオーバーライドできます。たとえばサブコンポーネントを持つオブジェクトを表すために定義できます。コードを変更した後ツールボックスのキャッシュをクリアするに Visual Studio の実験用インスタンスをリセットします。

DslPackage のプロジェクトで生成されるファイル

はツール ウィンドウ DslPackage ボックスとメニュー コマンド Visual Studio を管理するシェルに DSL モデルをします。クラスのほとんどのメソッドはオーバーライドできるようにする型です。

ファイル名

Description

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 をインスタンス化します。これはDSL パッケージの起動時にエディターを開くときに Visual Studio が使用する標準インターフェイスを実行します。これは Package.cs の ProvideEditorFactory の属性で参照されます。

GeneratedVSCT.vsct

メニューの標準メニュー コマンドを図コンテキスト メニューなど) ENT0ENT [入力] メニューなど検索します。コマンドのコードは 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 () メソッドが 1 回目の DSL が Visual Studio のインスタンスに読み込まれる呼び出されます。

Source.extension.vsixmanifest

このファイルをカスタマイズするには.tt ファイルを編集します。

Caution メモ注意
アイコンやイメージなどのリソースをインクルードする場合。.tt ファイルを編集するリソースが VSIX のビルドに含まれていることを確認します。ソリューション エクスプローラーでファイルを選択し[プロパティ] ENT0ENT の True であることを確認します。

DSL を Visual Studio Integration Extension (VSIX) にパッケージ化するかこのファイルを設定します。詳細については、「ドメイン固有言語ソリューションの配置」を参照してください。

参照

概念

方法: ドメイン固有言語を定義する

モデル、クラス、およびリレーションシップについて

ドメイン固有言語のカスタマイズおよび拡張

その他の技術情報

ドメイン固有言語をカスタマイズするコードの記述