Wix - 在未安装.Net框架时启动浏览器到.Net框架下载URL

Ver*_*min 7 .net wix

我有一个安装程序,它是从安装项目创建的,并使用MSBuild使用此处找到的方法构建.虽然我设置了生成.msi文件的构建过程,但我没有自己设置项目.安装项目的启动条件之一是检查.Net框架版本4,如果它未安装在目标计算机上,则会向用户显示一个消息框,询问他们是否要访问URL以下载.Net框架安装文件.如果用户在消息框中选择"是",则启动浏览器并加载URL.尼斯.安装项目还会检查我们的产品需要的另一个先决条件,并执行相同的操作.

我目前正在使用Wix重写安装程序,到目前为止,我已经能够解决一些小问题(请记住,我仍处于安装程序的早期阶段).我已经能够重新创建.Net Framework v4.0和其他必备软件的检查.我还能够显示消息框,询问用户是否要使用自定义wix操作启动浏览器到URL以下载其他必备软件.

问题

想要像旧安装程序那样为.Net Framework做同样的事情,我写了另一个自定义操作来启动浏览器到.Net框架下载URL.我编译了自定义操作和安装程序,并从我的测试机器中删除了.Net框架.我在我的测试机器上运行安装程序并且自定义操作不起作用,这是因为.Net Framework不再安装在测试机器上!

问题

有没有办法重新创建原始安装项目能够检查.Net框架的方式,向用户显示一个消息框,然后如果用户选择这样做,则启动浏览器到下载URL?我已经能够确定是否未安装框架,只需要一种方法来显示消息框,如果用户选择并阻止安装程序继续,则启动浏览器到特定的URL.

要么

有没有办法在没有安装.Net框架的机器上运行自定义操作?(我猜这个问题的答案是否定的!)

一如既往,先谢谢

Ver*_*min 11

好的,经过一些漫长的调查和大量的反复试验后,我能够实现在没有某些注册表项时启动默认Web浏览器的目标.

我首先检查了注册表中的必填项

<!--Property that indicates whether .Net framework 4.0 is currently installed-->
<Property Id="NETFRAMEWORK40">
  <RegistrySearch Id="NetFramework40" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
</Property>
<!--Property that indicates whether 2007 Office Data Connectivity is currently installed-->
<Property Id="ODCINSTALLED">
  <RegistrySearch Id="CheckODCVersion" Root="HKLM" Key="SOFTWARE\Classes\Installer\Products\000021091D0090400000000000F01FEC" Name="Version" Type="raw" />
</Property>   
Run Code Online (Sandbox Code Playgroud)

然后我将WixUtilExtension引用添加到项目中并设置以下3个自定义操作:

<CustomAction Id="SetExec1" Property="WixShellExecTarget" Value="http://go.microsoft.com/fwlink/?LinkID=186913" />
<CustomAction Id="SetExec2" Property="WixShellExecTarget" Value="http://www.microsoft.com/downloads/en/details.aspx?familyid=7554f536-8c28-4598-9b72-ef94e038c891&amp;displaylang=en" />
<CustomAction Id="LaunchBrowser" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="ignore" />
Run Code Online (Sandbox Code Playgroud)

前两个自定义操作用于设置将在不同时间使用的WixShellExecTarget属性,最后一个自定义操作是使用WixShellExec实用程序启动默认浏览器.

然后,我为我的安装程序UI设置了2个自定义对话框,只有2个带有短消息的简单消息框以及是和否按钮.以下只是其中一个消息框,因为它们在外观上非常相似:

  <Dialog Id="NetFRWDlg" Width="260" Height="95" Title="[ProductName] Installation" NoMinimize="yes">

    <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="40">
      <Text>This setup requires the .NET Framework version 4.0. Please install the .NET Framework and run this setup again. The .NET Framework can be obtained from the web. Would you like to do this now?</Text>
    </Control>

    <Control Id="YesButton" Type="PushButton" X="72" Y="67" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Yes]">
      <Publish Event="DoAction" Value="SetExec1" Order="1">1</Publish>
      <Publish Event="DoAction" Value="LaunchBrowser" Order="2">1</Publish>
      <Publish Event="EndDialog" Value="Exit" Order="3">1</Publish>
    </Control>

    <Control Id="NoButton" Type="PushButton" X="132" Y="67" Width="56" Height="17" Default="no" Cancel="yes" Text="[ButtonText_No]">
      <Publish Event="EndDialog" Value="Exit">1</Publish>
    </Control>

    <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="[WarningIcon]" />
  </Dialog>
Run Code Online (Sandbox Code Playgroud)

然后我将这两个对话框添加到InstallUISequence表中:

  <InstallUISequence>
    <Show Dialog="NetFRWDlg" After="AppSearch">
      (NOT Installed) AND (NOT NETFRAMEWORK40)
    </Show>
    <Show Dialog="ODCDlg" After="AppSearch">
      (NOT Installed) AND (NOT ODCINSTALLED)
    </Show>
    <Show Dialog="Install_PAGE1" After="CostFinalize" />
  </InstallUISequence>
Run Code Online (Sandbox Code Playgroud)

为了简要概述所有这些如何组合在一起,当安装程序启动时,它将使用NETFRAMEWORK40和ODCINSTALLED属性检查所需的注册表.在InstallUISequence期间,如果缺少这些注册表,将显示NetFRWDlg或ODCDlg对话框/消息框.然后,用户可以通过单击对话框/消息框的"是"按钮来选择启动默认浏览器以查看传入的URL.在执行此操作时,将执行设置WixShellExecTarget属性,启动默认浏览器和退出安装程序的操作序列.如果用户单击否,则安装程序将退出.

  • 难道你不能通过添加对WixNetFxExtension和`<PropertyRef Id ="NETFRAMEWORK40FULL"/>`的引用来简化这一点,而不是自己在注册表中查找以检查框架是否存在? (2认同)