到目前为止(感谢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>
答案 0 :(得分:4)
我能够提出以下解决方案。它并不理想,但它现在有效。我们得到了很短的时间来提出一些东西,所以这就是现在的“有效”。
我不得不多次回到文档,最终发现了我需要的东西以及我做错了什么。同样,这是解决我问题的“它可以解决的问题”。
我还能够获得“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中获得权利的关键是InstallCommand
和ExitCode
。理想情况下,这些将被正式记录。退出代码在某种程度上标准化以表示失败,现在需要重启成功,现在需要重新启动成功(请参阅first note)。