zoukankan      html  css  js  c++  java
  • 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    eclipse生成jar包 注意事项!
    java结合testng,利用XML做数据源的数据驱动示例
    2018 计蒜之道 初赛 第二场
    2018 计蒜之道 初赛 第一场
    Tarjan&&缩点简析
    POJ1159
    POJ1080
    POJ1260
    POJ2533&&1836&&3176
    Luogu P1484 种树
  • 原文地址:https://www.cnblogs.com/lonely7345/p/1686765.html
Copyright © 2011-2022 走看看