Visual Studio 2010のUMLモデルにプログラムからアクセスする - その1
で、舌の乾かぬうちに、ポストします。
私は昔から、UMLでも何でもよいのですが、モデリング技術を使って仕様定義、設計をきちんとしたら、そこから可能な限りの下流成果物を生み出すべきだ(それも足し算的にではなく掛け算的に)と思っている人でした。まぁ、絵をかいてコミュニケーションすれば、言葉だけより何百倍もチーム開発の効率が上がる事は否定しませんけれど。折角、開発でモデリング技術を駆使するなら、コミュニケーションにも役立ち、下流成果物もきちんと生成できるモデルであった方が、そして更にはプログラムもあまり書かないで、高度な機能が実現できた方が、(プログラマーは面白くないかもしれないですけど)、良いと思うんですよね。まぁ、私の私見なので、ご容赦
前置きはこれぐらいにして、Visual Studio 2010でUMLモデルを書いて、プログラムでその内容を取り出す方法を説明していきます。
先ず必要なのが、Visual Studio 2010 Ultimateです。ライセンスのない方は、評価版でも良いので、是非、お試しを。
そして、下の二つのSDKをインストールします。
- Visual Studio 2010 SDK
https://www.microsoft.com/downloads/details.aspx?FamilyID=47305cf4-2bea-43c0-91cd-1b853602dcc5&displaylang=en - Visual Studio 2010 Visualization And Modeling SDK
https://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=0def949d-2933-49c3-ac50-e884e0ff08a7
※RTM版の2010SDKより早く公開されていますが、大丈夫のようです。
これで、準備は完了です。
早速Visual Studio 2010を起動しましょう。
そして、空のSolutionを一つ作り、アクセス対象のUMLモデルを格納するためのModel Projectを一つ作ります。名前はTargetModelとしておきましょう。
そのプロジェクトに、一つUMLクラスダイアグラムを作って、幾つかのクラスを定義しておきます。
まぁ、こんな感じでいいでしょう。
次に、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
こんな風になります。
Modeling ProjectのTargetModelプロジェクトを選択するために、System.Windows.Formsも参照追加しておきましょう。
さてと、下図のように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ロボコン参加のどこかのチームが私のブログを参考にしてくれることを祈りながら・・・