如何检查.NET 6运行时是否安装

Noe*_*l H 10 wix .net-core

作为使用 .NET 6 和 WiX 安装程序安装 WPF 应用程序的一部分,我想检查是否安装了 .NET 6 运行时。

WiX 提供了预定义的属性来检查 .NET 框架的属性,但没有提供 .NET Core 及其他版本的属性,因此我尝试检查注册表项是否存在。

可以在以下位置检查注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedhost\Version

但是,如果我卸载运行时,注册表项不会被删除,是否有其他可靠的方法来检查是否安装了运行时以及安装了哪个版本?

Han*_*ank 10

2023 年 4 月

随着 WiX 4 的正式发布,现在原生支持通过 WiX 4 Netfx wixextension 检查计算机上是否安装了 .NET 运行时(核心、桌面或 aspnet):https: //wixtoolset.org/docs/架构/netfx/dotnetcompatibilitycheck/

用法示例:

<Fragment>
    <netfx:DotNetCompatibilityCheck Id="netCoreStatus" 
        Property="NETCORESTATUS" RollForward="latestMajor" 
        RuntimeType="core" Version="6.0.1" Platform="x64" />
    <Launch Condition="Installed OR NETCORESTATUS=&quot;0&quot;" 
        Message="[ProductName] requires Microsoft .NET Core - 6.0.1 or greater." />
</Fragment>
Run Code Online (Sandbox Code Playgroud)

在内部,它使用我在下面链接的相同包来运行 NetCoreCheck 可执行文件。


原答案

WiX 3 目前本身无法处理此问题。它正在针对 WiX v4 进行开发(GitHub 问题)。阅读该问题后,我发现这些工具是当前的解决方法。

https://www.nuget.org/packages/Microsoft.NET.Tools.NETCoreCheck.x86
https://www.nuget.org/packages/Microsoft.NET.Tools.NETCoreCheck.x64

您可以使用这些包内的文件来检查运行时。直接运行NetCoreCheck.exe或使用提供的自定义操作 DLL。

NetCoreCheck.exe -h查看帮助。但你会想要这样的东西:

netcorecheck --runtimename Microsoft.NetCore.App --runtimeversion 6.0.0
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用自定义操作 DLL,但我确实看到它有两个 DLL 导出。

 ordinal hint RVA      name

          1    0 00001500 CheckNETRuntime
          2    1 00002260 get_hostfxr_path
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 7

如果您想将其集成到您的 WiX 项目中,您可以使用 Hank 的答案中提到的自定义操作 DLL。

您可以使用NuGet包来获取dll。不幸的是,似乎没有这个 DLL 的文档,所以我使用源代码来弄清楚它是如何工作的。

首先,您需要定义一些属性,用作 .NET 运行时检查和检查结果的输入参数。

<Property Id="CheckNETRuntime_Framework" Value="Microsoft.AspNetCore.App" />
<Property Id="CheckNETRuntime_Version" Value="6.0.0" />
<Property Id="CheckNETRuntime_Result" />
Run Code Online (Sandbox Code Playgroud)

CheckNETRuntime_Framework是要搜索的框架。目前有3个选项:

  • 微软.NETCore.App
  • 微软.AspNetCore.App
  • 微软.Windows桌面.应用程序

CheckNETRuntime_Version是要查找的 .NET 版本。结果将存储在CheckNETRuntime_Result. 值0表示已找到运行时,任何其他值表示未找到。

要运行自定义操作,请执行以下操作:

<Binary Id="CustomActions" SourceFile="NetCoreCheckCA.dll" /> <!-- This should be the path to the dll -->

<CustomAction Id="CheckRuntime" Return="ignore" BinaryKey="CustomActions" DllEntry="CheckNETRuntime" />

<InstallExecuteSequence>
    <Custom Action="CheckRuntime" Before="LaunchConditions"  />
</InstallExecuteSequence>
<InstallUISequence>
    <Custom Action="CheckRuntime" Before="LaunchConditions"  />
</InstallUISequence>
Run Code Online (Sandbox Code Playgroud)

Return="ignore"注意:如果您不希望安装程序在找不到运行时时失败(如果返回值不为0,则表示失败),则需要添加。

CheckNETRuntime_Result属性可以在您的设置中的其他地方使用,例如您可以在以下条件中使用它:

<Condition Message=".NET 6 runtime is not installed">
    <![CDATA[CheckNETRuntime_Result=0]]>
</Condition>
Run Code Online (Sandbox Code Playgroud)


jco*_*cox 6

对于 Wix4 捆绑包,您需要DotNetCoreSearch而不是DotNetCompatibilityCheck。你像这样使用它:

<Wix ... xmlns:netfx="http://wixtoolset.org/schemas/v4/wxs/netfx">
  <Fragment>
    <netfx:DotNetCoreSearch Id="Dotnet6DesktopX86Version" Variable="Dotnet6DesktopX86Version"
      RuntimeType="desktop" Platform="x86" MajorVersion="6"/>
    <PackageGroup Id="Dotnet6DesktopX86Redist">
      <ExePackage DetectCondition="Dotnet6DesktopX86Version &gt;= v6.0.13"
      .../>
    </PackageGroup>
  </Fragment>
Run Code Online (Sandbox Code Playgroud)

DotNetCoreSearch 读取 dotnet 6 桌面 x86 的当前版本,然后如果低于 6.0.13,则 DetectCondition 为 false。 这里 wix 源代码中有一个更完整的示例