【问题标题】:Wix - Launch browser to the .Net framework download URL when .Net framework is not installedWix - 未安装 .Net 框架时启​​动浏览器到 .Net 框架下载 URL
【发布时间】:2011-10-19 15:31:42
【问题描述】:

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

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

问题

想要对 .Net Framework 执行与旧安装程序相同的操作,我编写了另一个自定义操作来启动浏览器到 .Net Framework 下载 URL。我编译了自定义操作和安装程序,并从我的测试机器中删除了 .Net 框架。我在测试机器上运行了安装程序,但自定义操作不起作用,这是由于 .Net Framework 不再安装在测试机器上!!

问题

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

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

一如既往,提前致谢

【问题讨论】:

    标签: .net wix


    【解决方案1】:

    好的,经过长时间的调查和反复试验,我能够实现在某些注册表项不存在时启动默认 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" />
    

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

    然后我将这 2 个对话框添加到 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 属性、启动默认浏览器和退出安装程序的一系列操作将执行。如果用户点击否,安装程序将直接退出。

    【讨论】:

    • 您不能通过添加对 WixNetFxExtension 和 &lt;PropertyRef Id="NETFRAMEWORK40FULL" /&gt; 的引用来简化这一点,而不是自己在注册表中查找以检查框架的存在吗?
    【解决方案2】:

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

    拥有托管引导程序应用程序后,添加 .Net 4.0 作为先决条件所需要做的就是......

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

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

    <PackageGroupRef Id="NetFx40Web"/>
    

    原来如此!

    NB 以上将通过 Internet 下载 .net 4,因此需要可用的 Internet 连接。更多信息和选项在这里:wixnetfxextension documentation

    【讨论】:

    • vcredist_x86_2010.exe 是否有类似的包引用?也许在不同的 Wix 扩展中?
    • VipX1,不是我知道的,但是如果你有一个用于安装的 msi,那么自己创建它并没有太多工作,只需将 msi 托管在某个地方并添加你自己的MSIPackage 与上面的 处于同一级别,或者如果您没有 msi,您可以随时创建一个:wixtoolset.org/documentation/manual/v3/xsd/wix/msipackage.html 如果创建自己的关键是首先创建 MSI,并添加到源代码管理和引用在 SourceFile 属性中,然后将其托管在 DownloadUrl 属性中 - 这样 MSI 的哈希值是静态的并且会成功下载。
    【解决方案3】:

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

    GenerateBootstrapper

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

    希望你觉得这很有用。

    【讨论】:

    • 这非常有用...但是,如果您想支持像 Windows XP 这样的操作系统怎么办。 Windows XP 不支持 .NET 4.5,并且通知用户应用程序在安装时不能在他们的操作系统上运行,而不是在他们去运行它时,这似乎更直观,也更不令人沮丧。虽然你可以创建一个 setup.exe,它包含在运行 MSI 的 bootsrapper 中,你会完成同样的事情。
    【解决方案4】:

    我想出了一个与 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多