Visual Studio 2010のUMLモデルにプログラムからアクセスする - その1

で、舌の乾かぬうちに、ポストします。

私は昔から、UMLでも何でもよいのですが、モデリング技術を使って仕様定義、設計をきちんとしたら、そこから可能な限りの下流成果物を生み出すべきだ(それも足し算的にではなく掛け算的に)と思っている人でした。まぁ、絵をかいてコミュニケーションすれば、言葉だけより何百倍もチーム開発の効率が上がる事は否定しませんけれど。折角、開発でモデリング技術を駆使するなら、コミュニケーションにも役立ち、下流成果物もきちんと生成できるモデルであった方が、そして更にはプログラムもあまり書かないで、高度な機能が実現できた方が、(プログラマーは面白くないかもしれないですけど)、良いと思うんですよね。まぁ、私の私見なので、ご容赦

前置きはこれぐらいにして、Visual Studio 2010でUMLモデルを書いて、プログラムでその内容を取り出す方法を説明していきます。
先ず必要なのが、Visual Studio 2010 Ultimateです。ライセンスのない方は、評価版でも良いので、是非、お試しを。

そして、下の二つのSDKをインストールします。

これで、準備は完了です。
早速Visual Studio 2010を起動しましょう。
そして、空のSolutionを一つ作り、アクセス対象のUMLモデルを格納するためのModel Projectを一つ作ります。名前はTargetModelとしておきましょう。
そのプロジェクトに、一つUMLクラスダイアグラムを作って、幾つかのクラスを定義しておきます。Sample UML Class Diagram

まぁ、こんな感じでいいでしょう。

次に、SolutionにWPFアプリケーションプロジェクトを一つ追加します。
そして、プロジェクトのプロパティを開き(プロジェクトを右クリック→“Property”)、Applicationタブの“Target framework”を“.NET Framework 4”に設定します。
※ここ重要。デフォルトは、.NET Framework 4.0 Client Profileになっていて、これが選択されていると、必要なすべてのAssemblyが表示されないようです。

そして、プロジェクトのReferencesを右クリックして、必要な以下のAssemblyを追加します。

  • Microsoft.VisualStudio.ArchitectureTools.Extensibility
  • Microsoft.VisualStudio.Modeling.SDK.10.0
  • Microsoft.VisualStudio.Modeling.SDK.Diagrams.10.0
  • Microsoft.VisualStudio.Uml.Interfaces
  • System.Component.Composition

こんな風になります。Assemblies added 

Modeling ProjectのTargetModelプロジェクトを選択するために、System.Windows.Formsも参照追加しておきましょう。

さてと、下図のようにXAMLを定義して、
Model Access Front-end XAML

“・・・”ボタンを押して、アクセスするModel Projectを選択するダイアログを表示して、“Retrieve”をクリックすると、UMLのクラスを抽出して下のTextBoxにクラスを表示します。

“・・・”ボタンをクリックしたときのハンドラーを、

System.Windows.Forms.OpenFileDialog dialog =    new System.Windows.Forms.OpenFileDialog();dialog.ShowDialog();tbTargetModel.Text = dialog.FileName;

のように書いて、上のTextBoxに選択したModel Projectのファイルパスを格納しておきます。

“Retrieve”ボタンをクリックしたときのハンドラーを、

TextWriter writer = new StringWriter();string projectPath = tbTargetModel.Text;// IModelingProjectReaderをプロジェクトパスからロードusing (IModelingProjectReader projectReader =    ModelingProject.LoadReadOnly(projectPath)){    // モデルストアをReaderから取出し    IModelStore modelStore = projectReader.Store;    writer.WriteLine("UML Classes:");    // モデルストアからIClass(UMLクラス)を取出し    foreach (IClass umlClass in modelStore.AllInstances<IClass>())    {        // UMLクラスのプロパティを参照        writer.WriteLine(" {0} - {1}",            umlClass.Name, umlClass.Namespace.Name);        foreach (var feature in umlClass.Features)        {            writer.WriteLine("  feature: {0} - {1}",               feature.Name, feature.FeaturingClassifiers.ToString());        }    }    tbResult.Text = writer.ToString();}

のように書きます。かなり素直なコードなので、説明しなくても判りますよね。こんな感じでUMLモデルへのアクセスができました。簡単ですね。後は、Visual StudioのIntellisence機能を使って、どんなプロパティを取り出せそうか、試してみてくださいね。
必要なusing宣言は、以下の通り。

using System.ComponentModel.Composition;using Microsoft.VisualStudio.Uml.Classes;using Microsoft.VisualStudio.ArchitectureTools.Extensibility;using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;using Microsoft.VisualStudio.Modeling.ExtensionEnablement;

これで、Visual Studio 2010をMDDツールにする第一歩を踏み出しました。

他に、英語では、MSDNに説明が載っているので、そちらも参考にしてくださいね。
https://msdn.microsoft.com/en-us/library/ee329484(v=VS.100).aspx

次回は、コードの生成、もしくは、プログラムでUMLモデルを書いていく方法を紹介する予定です。どちらが先になるかは私の気分次第。
ETロボコン参加のどこかのチームが私のブログを参考にしてくれることを祈りながら・・・