首页 文章

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

提问于
浏览
7

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

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

The Problem

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

The Question

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

要么

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

一如既往,先谢谢

3 回答

  • 0

    好的,经过一些漫长的调查和大量的反复试验,我能够实现在没有某些注册表项时启动默认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>
    

    然后我将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" />
    

    前两个自定义操作用于设置将在不同时间使用的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>
    

    然后我将这两个对话框添加到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>
    

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

  • 11

    正如ZFE所提到的,也许最简单的方法是使用引导程序 .

    拥有托管引导程序后,只需将.Net 4.0作为先决条件添加即可 .

    a)将文件WixNetFxExtension.dll的引用添加到Bootstrapper /托管引导程序应用程序项目中

    b)添加以下内容作为链中的第一项 .

    <PackageGroupRef Id="NetFx40Web"/>
    

    真的就是这样!

    NB以上将通过互联网下载.net 4,因此需要互联网连接 . 更多信息和选项:wixnetfxextension documentation

  • 2

    您所描述的内容可以通过使用bootstrappers来完成 . 生成这些将自动处理必备软件的安装 . 某些软件包已包含在Windows SDK(例如C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bootstrapper \ Packages)中,您可以使用它们,例如来自msbuild . 看看吧

    GenerateBootstrapper

    即将创建bootstrapper可执行文件的任务(首先构建你的msi,然后为它创建引导程序) .

    希望您觉得这个有帮助 .

相关问题