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に説明が載っているので、そちらも参考にしてくださいね。
http://msdn.microsoft.com/en-us/library/ee329484(v=VS.100).aspx


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

Comments (0)

Skip to main content