Visual Studio DSL 入门 14---用Wix制作安装程序

    我们到现在为止已经对Vs.net  dsl的基础知识进行了介绍,并且一步一步的完成了我们的状态机设计器的设计,在上一节结合T4模板生成了代码.但是我们一直还是在调试的项目中来做的,怎么能够让我们做的这个状态机设计器能够提供给其它人使用呢,在这一节,我们就来做一个安装程序,这样在只安装了VS.NET的机器上,不用安装SDK就可以使用我们的设计器了.
    VS.NET DSL专门提供了针对DSL的安装项目,我们直接基于这个项目来制作我们的安装程序:
    1.首先,向我们的解决方案中添加一个Dsl 安装项目,从项目类型中选择Extensibility—Domain Specific Language Setup:
       2010-3-13 12-16-44

    2. 我们可以看到在生成的项目中, 还是由很多tt文件, 其实dsl的安装是基于开源项目wix,不过在一般情况下,我们不需要手动去修改wix文件,不过如果一旦有特殊的需求,现有的这种机制是很难满足的. 我们来介绍一下这种安装机制:
       当我们向这个解决方案中添加DSL setup项目时,它会自动的寻找Dsl项目和DslPackage项目,并自动添加对这两个项目的引用,然后根据这两个项目中生成自己的元数据文件InstallerDefinition.dslsetup,我们来看一下这个文件:

隐藏行号 复制代码
  1. <installerDefinition xmlns="http://schemas.microsoft.com/VisualStudio/2005/DslTools/InstallerDefinitionModel" 
  2. productUrl="InsertProductUrlHere"
  3. defaultDirectoryName="LanguageSm"
  4. productVersion="1.0.0"
  5. requiresCSharp="true"
  6. requiresVisualBasic="true"
  7. productCode="326b807c-a6da-43ac-9d29-f75cf060622a"
  8. upgradeCode="cc04b782-48c3-49c5-a60e-eda39258bfaa"
  9. localeId="1033">
  10.     <dslPackage name="LanguageSm" project="DslPackage" assemblyPath="Company.LanguageSm.DslPackage.dll" registryRoot="SOFTWARE\Microsoft\VisualStudio\9.0">
  11.         <fileExtensions>
  12.             <fileExtension name="mydsl5" extension="mydsl5" descriptionKey="FileDescription" hasIcon="true" iconId="0"/>
  13.         </fileExtensions>
  14.         <supportingAssemblies>
  15.             <supportingAssembly name="Dsl" project="Dsl" assemblyPath="Company.LanguageSm.Dsl.dll"/>
  16.         </supportingAssemblies>
  17.     </dslPackage>
  18.     <licenseAgreement filePath="Files\EULA.rtf" isEmbedded="true" />
  19.     <supportingFiles>
  20.         <supportingFile name="Readme" filePath="Files\Readme.htm" installShortcut="true" shortcutIconPath="Resources\ReadmeShortcut.ico" openAfterInstall="true" />
  21.     </supportingFiles>
  22.     <vsItemTemplates>
  23.         <vsItemTemplate localeId="1033" targetDirectories="CSharp" project="DslPackage" templatePath="CSharp\1033\LanguageSm.zip"/>
  24.         <vsItemTemplate localeId="1033" targetDirectories="VisualBasic" project="DslPackage" templatePath="VisualBasic\1033\LanguageSm.zip"/>
  25.     </vsItemTemplates>
  26.     <dslSchemas>
  27.         <dslSchema project="Dsl" filePath="GeneratedCode\LanguageSmSchema.xsd"/>
  28.     </dslSchemas>
  29. </installerDefinition>

         (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
      
    下面再来看一下生成的其它几个文件:
     2010-3-14 10-51-48

     Main.wxs       这是wix的主文件,控制整个安装流程,包括对以下几个部分的引用.
     Files.wxs       需要在安装目录创建的目录结构和文件  包括dll和附属文件
     Registry.wxs    注册项信息,需要写入注册表的项
     UI.wxs          安装界面
     string.wxs     被其它部分使用的语言的键值对,如果需要多语言支持,可以再添加对应语言的文件,比如string_zh-cn.wxs
     
     除了string.wxs文件,其它的几个文件都是由tt文件生成的,不要手动去修改,即使修改了重新转换模板时也会被覆盖掉.
     3.我们暂时不需要做一些高级功能,现在先重新生成模板,然后编译整个安装项目:

隐藏行号 复制代码
  1.    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 
  2.    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  


    可以看到其实是调用了sdk中附带的wix的candle命令来生成. 编译完成后,在setup项目下的debug目录下面,可以找到生成的exe文件,我们点击安装:

    2010-3-14 11-38-25 
    接下来就是许可协议rtf文件的内容,同意后点下一步:
    2010-3-14 11-38-48
    这一步选择我们的安装目录:
    2010-3-14 11-39-09 
    选择完目录后,直接下一步,直接到完成安装,我们新建一个类库项目,添加项时就会看到我们的LanguageSm:
    2010-3-14 12-30-43

   添加后我们就可以和我们调试项目的时候一样进行状态机的设计了.不过生成代码的功能暂时还没有加进来.
    4.不过当你把这个生成的安装文件给没有安装过Visual stuido.net SDK的机器安装后,你会发现,没有作用,要让dsl能够直接在vs.net上安装,你还必须要有自己的PLK(Package Load Key).
      (1)登陆vsx的网站http://msdn.microsoft.com/zh-cn/vsx/cc655795(en-us).aspx,左下角的就是plk的注册信息,这些信息来源于你的DslDefinition.dsl的根结点的属性:
   2010-3-14 12-46-39

      (2)填写完这些信息完,点击生成PLK,会生成一串的字母.然后打开DslPackage项目下面的VSPackage.resx文件,添加一个键为1的字符串资源,值就是生成的PLK GUID.
  2010-3-14 13-17-35
      (3)打开DslPackage项目GeneratedCode文件夹下面的Package.tt文件,将下面这句用来加载PLK的属性标记的注释去掉:

隐藏行号 复制代码
  1. /// [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     http://code.msdn.microsoft.com/DSLToolsLab  系列教程  [本系列的入门案例的主要参考]

作者:孤独侠客似水流年
出处:http://lonely7345.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2010-03-16 00:01 孤独侠客 阅读(...) 评论(...) 编辑 收藏