域特定语言入门
本主题说明在定义和使用域特定语言 (dsl) 的基本概念 (DSL)。
如果您不熟悉 DSL,我们建议您通过 DSL Tools Lab工作,则可以解决此站点找到: Visualizaton and Modeling SDK
可以执行的操作与域特定语言 (dsl)?
域特定语言 (dsl) 是表示形式,通常为,旨在用于特定目的使用。 相反,语言 (如 UML 为泛型。 在 DSL,可以定义模型元素及其关系的类型,因此,它们在屏幕上存在。
当设计了一个 DSL 时,作为 Visual Studio 集成扩展 (vsix) 包的一部分,可以将其分发。 用户与在 Visual Studio的 DSL 一起使用:
表示形式作为 DSL 的组成部分。 与表示形式时, VSIX 包包含用户可以在应用帮助团队成员便可以生成从其模型参考资料的工具。
其中一个 DSL 的主应用程序是生成程序代码、配置文件和其他项目。 特别是在大型项目和产品系列,产品多种变体,将会创建生成许多从 DSL 的可变部分可提供以可靠性和一个非常快地响应的大型递增到要求更改。
其余部分是本概述介绍创建和使用域特定语言 (dsl) 基本操作 Visual Studio的演练。
必备组件
若要定义 DSL,必须安装以下组件:
Visual Studio |
|
Visual Studio SDK |
|
Visual Studio 可视化和建模 SDK |
创建 DSL 解决方案
通过使用域特定语言项目模板,创建一个新的域特定语言,将创建一个新的 Visual Studio 解决方案。
创建 DSL 解决方案
在**“文件”菜单上指向“新建”,再单击“项目”**。
在 项目类型下,展开 其他项目类型 节点,然后单击 扩展性。
单击 域特定语言设计器。
在 名称 框中,键入 FamilyTree。 单击**“确定”**。
域特定语言向导 打开,并显示模板 DSL 解决方案列表。
单击每个模板查看说明,
模板是有用的起始点。 每个提供完整的工作 DSL,可以编辑交互需要。 通常,您会选择模板最靠近希望创建。
对于本演练,选择 最小的语言 模板。
输入 DSL 的文件扩展名在适当的向导页。 这是包含 DSL 实例的文件将使用的扩展。
选择不与在计算机上的任何应用程序的扩展,或在要安装 DSL 的所有计算机。 例如, docx 和 htm 不可接受文件扩展名。
向导将警告,如果输入的扩展用作 DSL。 考虑使用不同的文件扩展名。 还可以重置 Visual Studio SDK 的实验实例中清除旧的实验设计器。 单击 开始,单击 所有程序、 Microsoft Visual Studio 2010 SDK、 工具然后 重置 Microsoft Visual Studio 2010 的实验实例。
检查其他页然后单击 完成。
包含两个项目的解决方案生成。 它们的名称 DSL 和 DslPackage。 名为 DslDefinition.dsl 的关系图文件打开。
备注
可以在两个项目的文件夹中显示的大多数代码从 DslDefinition.dsl 生成。因此,对 DSL 的大多数修改此文件进行。
用户界面现在类似于下图。
此解决方案定义域特定语言 (dsl)。 有关更多信息,请参见 域特定语言工具用户界面的概述。
DSL 解决方案的重要组成部分
通知新的解决方案的以下方面。
**DSL \DslDefinition .dsl **这是您在中看到的文件时要创建一个 DSL 解决方案。 几乎在解决方案中的所有代码从该文件生成,因此,您对 DSL 定义的大多数更改此处。 有关更多信息,请参见。 使用 DSL 定义图表一起使用。
DSL 项目此项目包含定义域特定语言的代码。
DslPackage 项目此项目包含在 Visual Studio允许 DSL 实例中打开和编辑的代码。
运行 DSL
,在创建之后,可以运行 DSL 解决方案。 之后,可以逐步修改 DSL 定义,再次运行该解决方案在每项更改后。
测试 DSL
单击在解决方案资源管理器工具栏中 转换所有模板 。 将重新生成大部分从 DslDefinition.dsl 的源代码。
备注
无论更改 DslDefinition.dsl,必须单击 转换所有模板 ,在重新生成解决方案。您可自动执行此步骤。有关更多信息,请参见 如何:自动转换所有模板。
按 F5,或者在 调试 菜单上,单击 开始调试。
DSL 生成并在 Visual Studio的实验实例中安装。
这将启动 Visual Studio 的实验实例。 的实验实例中获取其从注册表中单独子树的设置, Visual Studio 扩展名注册了用于调试目的。 Visual Studio 常规实例无法访问注册扩展的存在。
在 Visual Studio的实验实例中,打开名为从 解决方案资源管理器的 测试 的模型文件。
- 或 -
右击调试项目,指向 添加,然后单击 项目。 在 添加项目 对话框中,选择 DSL 的文件类型。
模型文件打开作为空白关系图。
工具箱打开并显示工具对应的关系图类型。
使用工具创建形状和连接线在关系图上。
若要创建形状,请在关系图上的形状拖动工具。
若要连接两个形状,请单击示例连接线工具,单击第一个形状,然后单击第二个形状。
单击形状的标签更改它们。
实验 Visual Studio 将类似于以下示例:
模型的内容
是 DSL 的实例文件的内容调用 模型。 该模型包含 modelelements和 链接 元素之间。 DSL 定义指定类型的模型元素和链接可以存在于模型。 例如,在从最小的语言模板创建的, DSL 具有模型元素的一个类型和链接一种类型。
DSL 定义可以指定该模型如何显示在关系图上。 可以从形状和连接线各种样式选择。 还可以指定这些形状出现在其他形状内。
,在编辑模型时,您可以查看设计为 资源管理器 视图的一个树。 当添加形状添加到关系图,模型元素还显示一个资源。 可以使用一个资源,即使没有关系图。
如果看不到在 Visual Studio调试实例中的资源管理器中, 视图 菜单中指向 其他窗口,然后单击 Your Language 资源管理器。
DSL API
DSL 生成可以读取和更新模型是 DSL 的实例 API。 API 的应用程序是从模型生成文本文件。 有关更多信息,请参见 使用 T4 文本模板生成设计时代码。
在调试解决方案,请打开扩展 “.tt”的模板文件。 这些示例演示如何从模型生成文本,并允许您测试 DSL 的 API。 一个示例。 Visual Basic,其他编写。 Visual C#。
在每个模板文件下是它生成的文件。 在解决方案资源管理器中展开模板文件,然后打开生成的文件。
模板文件包含列表在模型中所有元素代码的短的时间段。
生成的文件包含结果。
在更改的模型文件,您将看到在生成的文件中的相应更改,然后再重新生成隐藏文件。
重新生成文本文件,在更改模型隐藏文件
在 Visual Studio的实验实例中,保存模型文件。
确保在每次 .tt 文件的文件名参数是指模型文件为实验使用。 保存 .tt 文件。
在 解决方案资源管理器工具栏上单击 转换所有模板 。
- 或 -
右击要重新生成然后单击 运行自定义工具的模板。
可以将任意数量的文本模板文件添加到项目。 每个模板都生成一个结果文件。
备注
当您更改 DSL 定义,示例文本模板代码不起作用,,除非您进行更新。
有关更多信息,请参见从域特定语言生成代码和 编写代码以自定义域特定语言。
自定义 DSL
如果要修改 DSL 定义,请关闭实验实例并在主 Visual Studio 实例的定义。
备注
在修改了 DSL 定义,则可能会丢失在使用早期版本中,您创建的测试模型的信息。例如,调试解决方案包含一个名为 Sample,包含一些形状和连接线的文件。在开始开发 DSL 定义后,它们将不可见,并且,将会丢失,保存文件。
可以将各种扩展到 DSL。 下面的示例将使您可能的感觉。
在每个更改,保存 DSL 定义后,单击 " 解决方案资源管理器的 转换所有模板 ,然后按 F5 测试已更改的 DSL。
的类型和工具重命名
向现有字段的类和关系重命名。 例如,从最小的语言模板创建的 DSL 定义开始,您可以执行以下重命名操作,使 DSL 表示系族树。
至域类、关系和工具重命名
在 DslDefinition 关系图,将 ExampleModel 重命名为 FamilyTreeModel,为人员、目标在父和源的 ExampleElement 到子级。 可以单击每个标签以更改它。
对元素和连接线工具重命名。
通过单击选项卡打开 DSL 资源管理器窗口在解决方案资源管理器下。 如果看不到它,请在 视图 菜单中指向 其他窗口 然后单击 DSL 资源管理器。 ,仅当 DSL 定义关系图是活动窗口时, DSL 资源管理器中可见。
打开 " 属性 " 窗口并确定它,以便您可以同时查看 DSL Explorer 和属性。
在 DSL 资源管理器中,展开 编辑、 " 工具箱 " 选项卡、 your DSL然后 工具。
单击 ExampleElement。 这是用于创建组件的工具箱项。
在 " 属性 " 窗口中,将 名称 属性设置为人员。
声明 属性来更改的通知。
同样,请更改 ExampleConnector 工具的名称。 ParentLink。 修改 声明 属性,使其不是 name 属性的副本。 例如,输入父链接。
重新生成 DSL。
保存 DSL 定义文件。
单击在解决方案资源管理器工具栏中 转换所有模板
按 F5。 请等待,直到 Visual Studio 将出现的实验实例。
在 Visual Studio的实验实例中调试解决方案,请打开测试模型文件。 上来中拖动元素从工具箱。 请注意工具声明和类型在 DSL 资源管理器的名称已更改。
保存模型文件。
打开 .tt 文件并用新名称替换旧类型和属性名称的匹配项。
确保在 .tt 文件指定的文件名中指定测试组合模型。
保存 .tt 文件。 打开生成的文件可以查看运行在 .tt 文件中的代码的结果。 验证其是否正确。
添加字段特性添加到类
将特性添加到域类,如表示年份人员的生死。
若要使新的属性显示在关系图,必须将修饰器。显示模型元素的形状。 您还必须将属性映射到修饰器。
添加属性并演示其
添加特性。
在 DSL 定义关系图,右击人员域类,指向 添加,然后单击 字段的特性。
键入新的属性名称列表,例如生死。 在每个后按 输入 。
添加将显示在形状的属性的修饰器。
按照从 person 域类扩展到关系图的另一端的灰色行。 这是关系图元素映射。 它具有形状类链接字段类。
右击形状类,指向 添加,然后单击 text 修饰器。
添加具有名称的两个修饰器例如 BirthDecorator 和 DeathDecorator。
选择每个新修饰器,和 " 属性 " 窗口中,设置 确定 字段。 这将确定字段值的位置在形状将显示。 例如,设置 InnerBottomLeft 和 InnerBottomRight。
修饰器映射到特性。
打开 DSL 详细信息 " 窗口。 它通常在选项卡在输出窗口旁。 如果看不到它,请在 视图 菜单上,指向 其他窗口,然后单击 DSL 详细信息。
在 DSL 定义关系图,请单击连接人员域类形状到类的行。
在 DSL 详细信息,在 修饰器映射 选项卡上,单击复选框在一个未映射的修饰器。 在 显示属性,选择所需的字段映射属性。 例如,映射 BirthDecorator 到的问世。
保存 DSL,单击转换所有模板,然后按 F5。
在示例设计关系图,请验证您现在可以单击您选择的位置并键入值。它们。 此外,那么,当您选择人员形状时, " 属性 " 窗口中显示新的属性生死。
在 .tt 文件,可以将获取每个人属性的代码。
定义新类
可以添加字段类和关系将模型。 例如,可以创建新的类表示城镇和新的关系表示人员在城镇中。
若要使不同类型的清单在模型关系图,可以映射字段类以不同类型的形状,或者到不同的几何图形和颜色的形状。
若要添加并显示新域类
添加字段类并使其成为模型根。
在 DSL 定义关系图上,单击 嵌入关系 工具,单击根类 FamilyTreeModel,然后单击关系图的空白部分。
新字段类出现,则已连接到 FamilyTreeModel 用一个嵌入的关系。
将其名称,例如 Town。
备注
每个域类,但该模型的根必须至少一个嵌入关系的目标也必须从是嵌入的目标的类继承。因此,创建域类使用嵌入关系工具,通常很方便。
添加字段属性设置为新类,如名称。
添加人员和 Town 之间的引用关系。
单击 引用关系 工具,单击人员然后单击 Town。
备注
引用关系表示从模型树的一部分的交叉引用到另一个。
添加形状表示模型关系图的城镇。
从工具箱拖动 几何形状 到关系图并将它,如 TownShape 重命名。
在 " 属性 " 窗口中,将新形状的外观字段,如填充颜色和几何图形。
添加一个修饰器显示该城镇的名称,并将其重命名为 NameDecorator。 设置其位置属性。
映射 Town 域类为 TownShape。
单击 关系图元素映射 工具,然后单击 Town 域类然后 TownShape 形状类。
在 DSL 详细信息 窗口的 修饰器映射 选项具有选定的映射连接的,请检查 NameDecorator 并将 显示属性 命名。
创建连接线显示人员和城镇之间的关系。
从工具箱拖动到连接到关系图。 重命名并将其外观属性。
使用 关系图元素映射 工具与人员和 Town 之间的关系链接新的连接。
创建用于创建新的 Town 的一种元素工具。
在 DSL 资源管理器,展开 编辑 然后 " 工具箱 " 选项卡。
右击 your DSL 然后单击 添加新元素工具。
设置新工具的 名称 属性,并将其 类 属性设置为 Town。
设置 工具箱图标 属性。 单击 [...] 和在 文件名 字段,选择图标文件。
创建用于创建一个链接的连接线工具城镇和方之间。
右击 your DSL 然后单击 添加新连接工具。
设置新工具的 name 属性。
在 ConnectionBuilder 属性,请选择包含人员 Town 关系名称的生成器。
设置 工具箱图标。
保存 DSL 定义,单击 转换所有模板,然后按 F5。
在 Visual Studio的实验实例中,打开测试模型文件。 使用新工具创建城镇和链接城镇和人员之间。 请注意只能创建组件之间的正确类型的链接。
创建列表城镇每个人中的代码。 文本模板是可以运行此代码的某个位置。 例如,您可以修改在调试解决方案中的 Sample.tt 文件,使其包含以下代码:
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" debug="true" #> <#@ output extension=".txt" #> <#@ FamilyTree processor="FamilyTreeDirectiveProcessor" requires="fileName='Sample.ftree'" #> <# foreach (Person person in this.FamilyTreeModel.People) { #> <#= person.Name #><#if (person.Town != null) {#> of <#= person.Town.Name #> <#}#> <# foreach (Person child in person.Children) { #> <#= child.Name #> <# } } #>
当您保存 *.tt 文件,它将创建包含方及其住宅列表的一个从属文件。 有关更多信息,请参见 从域特定语言生成代码。
验证和命令
您可以通过添加验证约束进一步开发此 DSL。 这些约束是可以定义的方法,该方法,以确保模型在一个正确的状态。 例如,您可以定义约束,以确保子级的出生日期比之后其父级。 验证函数显示警告,如果 DSL 用户尝试保存中断任何约束的模型。 有关更多信息,请参见 域特定语言中的验证。
您还可以定义用户可以调用的菜单命令。 命令可以修改模型。 它们也适合在 Visual Studio 的其他模型和外部资源。 有关更多信息,请参见 如何:使用域特定语言修改标准的菜单命令。
部署 DSL
若要允许其他用户使用域特定语言,将一 Visual Studio 扩展 (vsix) 文件。 ,在生成 DSL 解决方案时,将创建。
查找 .vsix 文件解决方案的 bin 文件夹。 将该文件复制到要安装它的计算机。 在该计算机上,双击 VSIX 文件。 DSL 可用于 Visual Studio 所有实例在该计算机上。
您可以使用同一个程序安装 DSL 拥有计算机,以便您不必使用 Visual Studio的实验实例。
有关更多信息,请参见 部署域特定语言解决方案。
移除旧的实验 DSL
如果创建了您不再需要的实验 DSL,可以从计算机中移除它们通过重置 Visual Studio 的实验实例。
这将从计算机中移除所有的实验 DSL 和其他的实验 Visual Studio 扩展。 这些是在调试模式下执行的扩展。
此过程不移除执行 VSIX 文件完全安装了的 DSL 或其他 Visual Studio 扩展。
重置 Visual Studio 的实验实例
单击 启动,单击 所有程序、 Microsoft Visual Studio 2010 SDK、 工具然后 重置 Microsoft Visual Studio 2010 的实验实例。
重新生成仍希望使用的任何实验 DSL 或其他测试 Visual Studio 扩展。