如何:使用 Visual Studio API 打开 UML 模型

可以使用 API 在 Visual Studio 用户界面中打开模型和关系图。

如果只希望在程序代码中读取模型而不向用户显示模型,您可以使用以下方法:

在 Visual Studio 中打开模型和关系图

若要在用户界面中打开模型,请使用标准 Visual Studio API EnvDTE.DTE。 可以对建模项目项执行两种有用的强制转换:

  • 如果项目是建模项目,并且项目已加载到当前 AppDomain 中,则可以将 EnvDTE.Project 强制转换为 IModelingProject,以及进行反向强制转换。

  • 如果项为 UML 关系图,则可以将 EnvDTE.ProjectItem 强制转换为 IDiagramContext,以及进行反向强制转换。

在下面的示例中,您的项目应导入这些引用:

EnvDTE

Microsoft.VisualStudio.ArchitectureTools.Extensibility

Microsoft.VisualStudio.Modeling.Sdk.10.0

Microsoft.VisualStudio.Modeling.Sdk.Diagrams.10.0

Microsoft.VisualStudio.Uml.Interfaces

System.ComponentModel.Composition

此示例在 Visual Studio 中打开一个 UML 模型:

using EnvDTE; // Visual Studio API for loading diagrams
using 
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Modeling; 
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;  
   // for ICommandExtension and other handler types
using Microsoft.VisualStudio.Uml.Classes; 
   // for basic UML types
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
   // for model construction methods
using EnvDTE;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility;
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation; 
                             // for IDiagram 
...

在 Visual Studio 扩展中,您可以进行此声明以获取对宿主服务提供程序的访问权限:

[Import] public Microsoft.VisualStudio.Shell.SVsServiceProvider ServiceProvider {get;set;}
...

在方法中,您可以访问项目(例如,当前项目):

DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE));
Project project = dte.ActiveDocument.ProjectItem.ContainingProject;
IModelingProject modelingProject = project as IModelingProject;
if (modelingProject == null) return; // not a modeling project

// Access the model's store and contents.
IModelStore store = modelingProject.Store;
foreach (IElement element in store.Root.OwnedElements) {...}

// Open all the project's diagrams.
foreach (ProjectItem item in project.ProjectItems)
{ 
     IDiagramContext modelingItem = item as IDiagramContext;
     if (modelingItem == null)
         continue; // not a model diagram
     IDiagram diagram = modelingItem.CurrentDiagram;
     if (diagram == null)
     {
        // Diagram is closed. Open it.
        item.Open().Activate();
        diagram = modelingItem.CurrentDiagram;
     }
     // Access the shapes.
     foreach (IShape<IElement> shape 
               in diagram.GetChildShapes<IElement>())
     {
       IElement displayedElement = shape.Element;
       ...
     }
   }
} 

请参见

概念

使用 UML API 编程

扩展 UML 模型和关系图