我们到现在为止已经对Vs.net dsl的基础知识进行了介绍,并且一步一步的完成了我们的状态机设计器的设计,在上一节结合T4模板生成了代码.但是我们一直还是在调试的项目中来做的,怎么能够让我们做的这个状态机设计器能够提供给其它人使用呢,在这一节,我们就来做一个安装程序,这样在只安装了VS.NET的机器上,不用安装SDK就可以使用我们的设计器了.
VS.NET DSL专门提供了针对DSL的安装项目,我们直接基于这个项目来制作我们的安装程序: 1.首先,向我们的解决方案中添加一个Dsl 安装项目,从项目类型中选择Extensibility—Domain Specific Language Setup:2. 我们可以看到在生成的项目中, 还是由很多tt文件, 其实dsl的安装是基于开源项目wix,不过在一般情况下,我们不需要手动去修改wix文件,不过如果一旦有特殊的需求,现有的这种机制是很难满足的. 我们来介绍一下这种安装机制:
当我们向这个解决方案中添加DSL setup项目时,它会自动的寻找Dsl项目和DslPackage项目,并自动添加对这两个项目的引用,然后根据这两个项目中生成自己的元数据文件InstallerDefinition.dslsetup,我们来看一下这个文件:productUrl="InsertProductUrlHere"
defaultDirectoryName="LanguageSm"
productVersion="1.0.0"
requiresCSharp="true"
requiresVisualBasic="true"
productCode="326b807c-a6da-43ac-9d29-f75cf060622a"
upgradeCode="cc04b782-48c3-49c5-a60e-eda39258bfaa"
localeId="1033">
(1).根结点installerDefinition下面是全局的定义,包括产品URL,目录名称,版本,是否在安装需要vs.net安装c#或者是BisualBasic等,在这里我们注意需要把requireVisualBasic设置为false.
(2).dslPackge结点是对我们的dsl的一些注册信息,这些信息都来自于我们的DslDefinition.dsl文件,不过我们这里可以对这些信息进行一些修改. (3).licenseAgreement 许可协议文件,这会在安装过程中显示出来. (4).supportingFiles, 需要复制到安装目录的文件列表 (5).vsItemTemplates 项目项模板,是在项目中新增项的时候的,而不是说我们生成代码的tt模板,也不是说新增项目的模板 , localeId是区域id,你可以根据你的vs.net语言版本改成2052 下面再来看一下生成的其它几个文件:Main.wxs 这是wix的主文件,控制整个安装流程,包括对以下几个部分的引用.
Files.wxs 需要在安装目录创建的目录结构和文件 包括dll和附属文件 Registry.wxs 注册项信息,需要写入注册表的项 UI.wxs 安装界面 string.wxs 被其它部分使用的语言的键值对,如果需要多语言支持,可以再添加对应语言的文件,比如string_zh-cn.wxs 除了string.wxs文件,其它的几个文件都是由tt文件生成的,不要手动去修改,即使修改了重新转换模板时也会被覆盖掉. 3.我们暂时不需要做一些高级功能,现在先重新生成模板,然后编译整个安装项目:D:\Program Files\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Tools\Wix\candle.exe -dConfiguration=Debug -out obj\Debug\ -w0 -v Files.wxs Registry.wxs Main.wxs UI.wxs
D:\Program Files\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Tools\Wix\light.exe -b F:\NET\Projects\LanguageSm\LanguageSmSetup -loc Strings.wxl -out bin\Debug\LanguageSm.msi -sa -w0 -v obj\Debug\Files.wixobj obj\Debug\Registry.wixobj obj\Debug\Main.wixobj obj\Debug\UI.wixobj
接下来就是许可协议rtf文件的内容,同意后点下一步: 这一步选择我们的安装目录: 选择完目录后,直接下一步,直接到完成安装,我们新建一个类库项目,添加项时就会看到我们的LanguageSm:
添加后我们就可以和我们调试项目的时候一样进行状态机的设计了.不过生成代码的功能暂时还没有加进来.
4.不过当你把这个生成的安装文件给没有安装过Visual stuido.net SDK的机器安装后,你会发现,没有作用,要让dsl能够直接在vs.net上安装,你还必须要有自己的PLK(Package Load Key). (1)登陆vsx的网站,左下角的就是plk的注册信息,这些信息来源于你的DslDefinition.dsl的根结点的属性:(2)填写完这些信息完,点击生成PLK,会生成一串的字母.然后打开DslPackage项目下面的VSPackage.resx文件,添加一个键为1的字符串资源,值就是生成的PLK GUID.
(3)打开DslPackage项目GeneratedCode文件夹下面的Package.tt文件,将下面这句用来加载PLK的属性标记的注释去掉:/// [VSShell::ProvideLoadKey("Standard", Constants.ProductVersion, Constants.ProductName, Constants.CompanyName, 1)]
(4)保存文件,重新转换模板,再编译dslsetup项目生成exe文件,这次就可以直接在未安装sdk的机器上安装使用了.
5. 即使你可能觉得Dsl setup安装项目还是很强大的,不过我还是需要说明以下几点:
(1)使用wix结合t4制作dsl安装项目,虽然简单,但是有失灵活性,如果你想扩展在使用现有的这种方式会有些麻烦除非你脱离开T4,就直接使用wix来完成. (2)使用wix,就是把注册表操作,复制文件操作,多语言处理,安装界面和流程处理等通过它特有的xml和扩展机制来实现,你完全可以不用这种机制,不用dsl setup项目,而使用自己的安装方式. 比如直接新建普通的安装项目或者是使用installshiled. (3)很高兴的看到,在vs 2010中的关于dsl的安装已经不使用wix了,而是通过新的扩展管理器来加载.
参考资源
1. Visual Stuido DSL 工具特定领域开发指南 2. DSL Tools Lab 系列教程 [本系列的入门案例的主要参考]作者:()
出处: 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。