如何:使用 Visual Studio API 打开 UML 模型
可以使用 API 在 Visual Studio 用户界面中打开模型和关系图。
如果只希望在程序代码中读取模型而不向用户显示模型,您可以使用以下方法:
Visual Studio 模型总线允许您访问模型和模型内的元素,并提供了在一个模型和另一个模型之间建立链接的标准方法。有关更多信息,请参见如何:将 UML 模型与其他模型和工具集成。
可以在只读模式下打开模型。有关更多信息,请参见如何:在程序代码中读取 UML 模型。
在 Visual Studio 中打开模型和关系图
若要在用户界面中打开模型,请使用标准 Visual Studio API EnvDTE.DTE。可以对建模项目项执行两种有用的强制转换:
如果项目是建模项目,并且项目已加载到当前 AppDomain 中,则可以将 EnvDTE.Project 强制转换为 IModelingProject,以及进行反向强制转换。
如果项为 UML 关系图,则可以将 EnvDTE.ProjectItem 强制转换为 IDiagramContext,以及进行反向强制转换。
在下面的示例中,您的项目应导入这些引用:
EnvDTE
Microsoft.VisualStudio.ArchitectureTools.Extensibility
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.11.0
Microsoft.VisualStudio.Shell.Immutable.11.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;
...
}
}
}