WiX Bootstrapper - 难以检测软件是否已安装C ++可再发行组件,SQL Server Compact 3.5 SP2

时间:2014-05-29 22:14:45

标签: c++ wix bootstrapper burn

到目前为止(感谢Rob Mensching的一篇文章),如果安装了.NET 4.0,我的代码将检测它,并且它会直接通过它。我无法正确检测Microsoft Visual C ++ 2010 x86可再发行组件或Microsoft SQL Server Compact 3.5 Service Pack 2.

我的代码如下。我正在学习,所以我会尽可能多地欣赏建设性的批评。

<!-- Search for .NET 4.0 -->
<util:RegistrySearch Id="NETFRAMEWORK40"
                     Root="HKLM"
                     Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                     Value="Install"
                     Variable="NETFRAMEWORK40"
                     Result="value"/>
<!-- Search for Microsoft Visual C++ 2010 x86 Redistributable -->
<util:RegistrySearch Id="SearchForCPP2010X86"
                     Root="HKLM"
                     Key="SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86"
                     Value="Install"
                     Variable="CPP2010Redist"
                     Result="exists"/>
<!-- Search for Microsoft SQL Server Compact 3.5 Service Pack 2 -->
<util:RegistrySearch Id="SearchForSQLSvrCE35SP2"
                     Root="HKLM"
                     Key="SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v3.5\ENU"
                     Value="Install"
                     Variable="SQLSvrCE35SP2"
                     Result="exists"/>

<Chain>
    <!-- Install .NET 4 Full -->
    <PackageGroupRef Id="Net4Full"/>
    <!-- Install Microsoft Visual C++ 2010 x86 Redistributable -->
    <PackageGroupRef Id="MSVisCPP2010x86Redist"/>
    <!-- Install Microsoft SQL Server Compact 3.5 Service Pack 2 -->
    <PackageGroupRef Id="SQLExpressCE"/>
</Chain>


<!-- Install .NET 4.0 -->
<PackageGroup Id="Net4Full">
    <ExePackage Id="Net4Full"
                Name="Microsoft .NET Framework 4.0 Setup"
                Cache="no"
                Compressed="yes"
                PerMachine="yes"
                Permanent="yes"
                Vital="yes"
                SourceFile="BootstrapperLibrary\dotNetFx40_Full_setup.exe"
                DetectCondition="NETFRAMEWORK40"/>
</PackageGroup>

<!-- Install Microsoft Visual C++ 2010 x86 Redistributable -->
<PackageGroup Id="MSVisCPP2010x86Redist">
    <ExePackage Id="MSVisCPP2010x86Redis"
                Name="Microsoft Visual C++ 2010 x86 Redistributable "
                Cache="no"
                Compressed="yes"
                PerMachine="yes"
                Permanent="yes"
                Vital="yes"
                SourceFile="BootstrapperLibrary\vcredist_x86.exe"
                DetectCondition="CPP2010Redist"/>
</PackageGroup>

<!-- Install Microsoft SQL Server Compact 3.5 Service Pack 2 -->
<PackageGroup Id="SQLExpressCE">
   <ExePackage Id="SQLExpressCE"
               Name="Microsoft SQL Server Compact 3.5 Service Pack 2 Setup"
               Cache="no"
               Compressed="yes"
               PerMachine="yes"
               Permanent="yes"
               Vital="yes"
               SourceFile="BootstrapperLibrary\SSCERuntime-ENU.exe"/>
</PackageGroup>

2 个答案:

答案 0 :(得分:4)

我能够提出以下解决方案。它并不理想,但它现在有效。我们得到了很短的时间来提出一些东西,所以这就是现在的“有效”。

我不得不多次回到文档,最终发现了我需要的东西以及我做错了什么。同样,这是解决我问题的“它可以解决的问题”。

WiX manual

WiX tutorial

我还能够获得“WiX 3.6:Windows Installer XML开发人员指南”一书的副本,这本书证明是有用的。如果从第一天开始就可以使用,那将非常有用。

我对在线WiX教程的唯一抱怨是,它没有我在美国的副本(我能找到)。我必须通过我们的网络安全部门提交网站批准的请求。我现在可以访问,但我不得不等待一天才能使用它。当你处于一个非常紧张的开发周期时,有一天是一件大事。

最初,我的部分故事是搜索32位和64位版本的SQL Server CE。我在使用64位版本时遇到了一些问题并且没时间用完了,所以我使用附件来下载适用的32位和64位安装文件。

<!--Search for .NET 4.0-->
<util:RegistrySearch Id="NETFRAMEWORK40"
                     Root="HKLM"
                     Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"
                     Value="Install"
                     Variable="NETFRAMEWORK40"
                     Result="value"/>
<!--Search for Microsoft Visual C++ 2010 x86 Redistributable-->
<util:RegistrySearch Root="HKLM"
                     Key="SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86"
                     Variable="CPP2010Redist"
                     Value="Installed"
                     Result="value"/>
<!--Search for Microsoft SQL Server Compact 3.5 Service Pack 2 x86-->
<util:RegistrySearch Id="SqlCeRegistryx86"
                     Root="HKLM"
                     Key="SOFTWARE\Microsoft\Microsoft SQL Server Compact Edition\v3.5\ENU"
                     Variable="SQLSvrCE35SP2x86"
                     Win64="no"
                     Result="exists"/>


<Chain>
  <!-- Install .Net 4 Full -->
  <PackageGroupRef Id="Net4Full"/>
  <!-- Install Microsoft Visual C++ 2010 x86 Redistributable -->
  <PackageGroupRef Id="MSVisCPP2010x86Redist"/>
  <!-- Install Microsoft SQL Server Compact 3.5 Service Pack 2 x86 -->
  <PackageGroupRef Id="SQLExpressCEx86"/>
</Chain>


<Fragment Id="Prerequisites">
<!--.NET 4.0-->
<PackageGroup Id="Net4Full">
  <ExePackage Id="Net4Full"
              Cache="no"
              Compressed="yes"
              PerMachine="yes"
              Permanent="yes"
              Vital="yes"
              SourceFile="BootstrapperLibrary\dotNetFx40_Full_setup.exe"
              DetectCondition="NETFRAMEWORK40"/>
</PackageGroup>
<!--Microsoft Visual C++ 2010 x86 Redistributable-->
<PackageGroup Id="MSVisCPP2010x86Redist">
  <ExePackage Id="MSVisCPP2010x86Redist"
              Cache="no"
              Compressed="yes"
              PerMachine="yes"
              Vital="yes"
              SourceFile="BootstrapperLibrary\vcredist_x86.exe"
              DetectCondition="CPP2010Redist"/>
</PackageGroup>
<!--Microsoft SQL Server Compact 3.5 Service Pack 2 x86-->
<PackageGroup Id="SQLExpressCEx86">
  <ExePackage Id="SQLExpressCEx86"
              Cache="no"
              Compressed="yes"
              PerMachine="yes"
              Vital="yes"
              SourceFile="BootstrapperLibrary\SSCERuntime-ENU.exe"
              DetectCondition="SQLSvrCE35SP2x86"/>
</PackageGroup>

答案 1 :(得分:0)

当然,检测是可再发行的工作。如果已知可再发行组件具有不良行为的场景(即被破坏),我只会尝试自己重现它。即便如此,我会首先寻找官方文件。

微软的Aaron Stebner在他的个人blog中说:

  

总的来说,我对VC ++可再发行软件包的建议是   不费心去尝试检测包是否已安装。   相反,我建议你总是在你的期间安装它们   安装过程。

您的安装程序声明的目标是使VC 2010运行时库的最终状态在某个服务包级别上起作用。它将此目标传达给可再分发的,并且(希望)通过它认为必要的任何安装和/或修复过程有效地实现它。

在ExePackage中获得权利的关键是InstallCommandExitCode。理想情况下,这些将被正式记录。退出代码在某种程度上标准化以表示失败,现在需要重启成功,现在需要重新启动成功(请参阅first note)。

相关问题