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

时间:2011-10-19 15:31:43

标签: .net wix

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

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

问题

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

问题

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

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

一如既往地提前谢谢

4 个答案:

答案 0 :(得分: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>   

然后我将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属性,启动默认浏览器和退出安装程序的操作序列。如果用户单击否,则安装程序将退出。

答案 1 :(得分:2)

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

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

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

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

<PackageGroupRef Id="NetFx40Web"/>

真的就是这样!

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

答案 2 :(得分:0)

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

看看

GenerateBootstrapper

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

希望你觉得这很有用。

答案 3 :(得分:0)

我想出了一个与 Vermin 略有不同的解决方案。如果您不想像其他答案建议的那样使用引导程序应用程序,您可以尝试创建自定义操作和自定义对话框。

您可以使用 WixNetfxExtension,而不是检查 .NET Framework 注册表值。可以通过将“-ext WixNetfxExtension”作为参数传递给 light.exe 调用或使用 Visual Studio WiX 扩展引用它来引用它。然后您可以使用此属性来检查 .NET Framework "release number"。在这种情况下,它会检查安装的 FW 是否为 4.7.2 或更高版本。设置 Sequence="1" 让我们在安装开始之前出现对话框。对我来说 After="AppSearch" 不起作用。

<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />

<InstallUISequence>
  <Show Dialog="DotnetFwNotInstalledDialog" Sequence="1">
    <![CDATA[Installed OR (WIXNETFX4RELEASEINSTALLED >= "#461808")]]>
  </Show>
</InstallUISequence>

接下来,设置打开下载页面的自定义操作:

<CustomAction Id="SetWixShellExec_DotnetFwLink" Property="WixShellExecTarget" Value="https://dotnet.microsoft.com/download/dotnet-framework/net472" />
<CustomAction Id="LaunchBrowser" BinaryKey="WixCA" DllEntry="WixShellExec" Execute="immediate" Return="ignore" />

在 UI 元素中,定义您的自定义对话框。我不知道 Vermin 如何使用控制元素 (Text="[WarningIcon]") 配置图标。我用一个名为“MyIconBinary”的二进制元素来完成它,它指向图标文件。

<UI>
  <Dialog Id="DotnetFwNotInstalledDialog" 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.7.2. Please download and install the .NET Framework 4.7.2 Runtime and run this setup again. Would you like to proceed to the download page?</Text>
    </Control>
    <Control Id="DownloadPageButton" Type="PushButton" X="48" Y="67" Width="106" Height="17" Default="yes" Cancel="yes" Text="Proceed to download page">
      <Publish Event="DoAction" Value="SetWixShellExec_DotnetFwLink" 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="ExitButton" Type="PushButton" X="160" Y="67" Width="56" Height="17" Default="no" Cancel="yes" Text="Exit">
      <Publish Event="EndDialog" Value="Exit">1</Publish>
    </Control>
    <Control Id="WarningIcon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Warning" FixedSize="yes" IconSize="32" Text="MyIconBinary" />
  </Dialog>
  
  <Binary Id="MyIconBinary" SourceFile="Resources\MyIcon.ico" />     
</UI>