如何确定是否安装了。net Core

我知道对于旧版本的.NET,您可以通过以下方法确定是否安装了给定的版本

https://support.microsoft.com/en-us/kb/318785

是否有官方方法确定是否安装了。net 核心 ?

(我不是说SDK,我想检查一个没有SDK的服务器,以确定它是否安装了DotNetCore.1.0.0-WindowsHosting.exe)

我能看到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NET Cross-Platform Runtime Environment\.NET Framework 4.6\Win\v1-rc1

在我的windows 7机器上使用1.0.11123.0版本#,但我在windows 10机器上没有看到相同的东西。

433653 次浏览

您可以检查dotnet.exe是否可用:

where dotnet

然后你可以检查版本:

dotnet --version

更新:现在有一个更好的方法来做到这一点,这在许多其他的答案中有很好的解释:

dotnet --info

确定.NET Core是否安装在Windows上的一个伪方法是:

  • 窗户 + R
  • 类型cmd
  • 在命令提示符上,键入dotnet --version

dotnet——version

如果安装了.NET Core,在上述步骤中不应该得到任何错误。

问得好,还有答案并不简单。没有“显示所有。net核心版本”命令,但还是有希望的。

编辑:

我不确定它是什么时候添加的,但是info命令现在在输出中包含了这个信息。它会打印出已安装的运行时和sdk,以及其他一些信息:

dotnet --info

如果你只想看到sdk: dotnet --list-sdks

如果你只想查看已安装的运行时:dotnet --list-runtimes

我用的是Windows系统,但我猜这在Mac或Linux上也适用。

此外,你可以引用.NET核心下载存档来帮助你破译SDK版本。


< >强老信息: < p>以下的所有信息都是旧信息,不太相关,但可能仍然有用

参见installed 运行时:

在Windows资源管理器中打开C:\Program Files\dotnet\shared\Microsoft.NETCore.App

参见installed sdk:

在Windows资源管理器中打开C:\Program Files\dotnet\sdk

(位置的来源:开发者博客)


此外,通过在命令提示符处发出这些命令,您可以看到已安装的最新的运行时和SDK版本:

dotnet 首先列出的是最新的运行时版本。 免责声明:此选项不再有效,但对于旧版本可能有效。

dotnet --version 最新SDK版本 免责声明:显然,此结果可能受到任何全局变量的影响。Json配置文件。


在macOS上,您可以使用下面的命令检查.net核心版本。

ls /usr/local/share/dotnet/shared/Microsoft.NETCore.App/

在Ubuntu或Alpine上:

ls /usr/share/dotnet/shared/Microsoft.NETCore.App/

它将列出带有已安装版本名称的文件夹。

对于没有SDK的纯运行时环境,例如安装了Windows托管包的服务器,正确的答案是使用以下命令运行PowerShell:

dotnet --info

根据官方文档:

  • --version选项“打印正在使用的. net Core SDK的版本”,因此如果SDK未安装,该选项将不起作用。而……
  • --info选项“打印关于CLI工具和环境的详细信息,例如当前操作系统,提交版本的SHA,以及其他信息。”

下面是另一篇解释.NET核心版本如何工作的官方文章。:)

(1)如果您使用的是windows系统。

打开命令提示符。

 dotnet --version

(2)如果是Linux系统,执行以下命令。

dotnet --version


dotnet --info

我主要使用Windows开发机器和服务器。

我只是想指出(至少对于NET。Core 2.0及以上版本),唯一需要做的是在命令提示符中执行dotnet --info来获取有关已安装的最新的版本的信息。如果安装了。net Core,你会得到一些响应。

在我的开发机器(Windows 10)上,结果如下所示。SDK是2.1.2,运行时是2.0.3。

.NET Command Line Tools (2.1.2)


Product Information:
Version:            2.1.2
Commit SHA-1 hash:  5695315371


Runtime Environment:
OS Name:     Windows
OS Version:  10.0.15063
OS Platform: Windows
RID:         win10-x64
Base Path:   C:\Program Files\dotnet\sdk\2.1.2\


Microsoft .NET Core Shared Framework Host


Version  : 2.0.3
Build    : a9190d4a75f4a982ae4b4fa8d1a24526566c69df

在我的一台运行Windows Server 2016与Windows Server托管包(没有SDK)的服务器上,结果如下所示。没有SDK,运行时是2.0.3。

Microsoft .NET Core Shared Framework Host


Version  : 2.0.3
Build    : a9190d4a75f4a982ae4b4fa8d1a24526566c69df

干杯!

使用Powershell:

运行时:

(dir (Get-Command dotnet).Path.Replace('dotnet.exe', 'shared\Microsoft.NETCore.App')).Name

sdk:

(dir (Get-Command dotnet).Path.Replace('dotnet.exe', 'sdk')).Name

在windows中,你只需要打开命令提示符并输入:

dotnet --version

如果安装了。net核心框架,您将获得当前安装的版本

看到截图:

enter image description here

以下命令可用于.NET Core SDK 2.1 (v2.1.300):

要列出所有已安装的。net Core sdk,请使用:dotnet --list-sdks

使用dotnet --list-runtimes列出所有已安装的。net Core运行时

(截至2018年6月3日,在Windows上测试,2018年8月23日再次测试)

截至2018年10月24日更新:更好的选项现在可能是终端或PowerShell窗口中的dotnet --info,正如已经在其他答案中提到的。

C:\Program Files\dotnet\shared\Microsoft.NETCore.App中查看运行时的哪些版本在那里有目录。源。

这里的许多答案混淆了SDK和运行时,两者是不同的。

在所有其他答案之后,这可能会被证明是有用的。

在Visual Studio中打开应用程序。在“解决方案资源管理器”中,右键单击项目。单击“属性”。单击应用程序。在“目标框架”下,点击下拉按钮,你就看到了所有已安装的框架。

顺便说一句,你现在可以选择你想要的框架。

或者你也可以看看里面

C:\Program Files\dotnet\sdk

执行此命令

dotnet --list-sdks

enter image description here

有可能。net Core已经安装,但没有添加到PATH 变量,用于您的操作系统或用户配置文件。运行 dotnet命令可能不起作用。作为替代方案, 你可以检查。net Core安装文件夹是否存在

如果在安装过程中没有更改它,则它将安装到标准文件夹中

  • dotnet可执行文件C:\program files\dotnet\dotnet.exe

  • < p >。Net SDK __abc0

  • < p >。NET运行时C:\program files\dotnet\shared\{runtime-type}\{version}\

要了解更多详细信息,请查看。net文档中的如何检查.NET Core是否已经安装页面

您可以看到终端当前安装了哪些版本的. net Core SDK。打开终端,执行如下命令。

dotnet --list-sdks
dotnet --info

dotnet --version

把上面的命令写在你的CMD终端上。然后它会显示一些像咆哮 enter image description here < / p >

enter image description here

可以使用 Run>命令比;dotnet——版本 enter image description here < / p >

这种方法只能在Windows上工作,可能有点多余。

function Get-InstalledApps {
[CmdletBinding(SupportsShouldProcess=$false)]
Param ([Parameter(Mandatory=$false, ValueFromPipeline=$true)] [string]$ComputerName=$env:COMPUTERNAME,
[Parameter(Mandatory=$false, ValueFromPipeline=$false)] [System.Management.Automation.PSCredential]$Credential)


Begin { Write-Verbose "Entering $($PSCmdlet.MyInvocation.MyCommand.Name)" }


Process {
$HKEY_LOCAL_MACHINE=2147483650
$Results=@()


if ($Credential -eq $null) { $Reg=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine,$ComputerName) }
else { $Reg=Get-WmiObject -Namespace "root\default" -List "StdRegProv" -ComputerName $ComputerName -Credential $Credential }


$RegPath=@("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")
if ([IntPtr]::Size -ne 4) {
$RegPath+="SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
}


for ($i=0; $i -lt $RegPath.Count; $i++) {
if ($Credential -eq $null) {
$RegKey=$Reg.OpenSubKey($RegPath[$i])
$InstallKeys=$RegKey.GetSubKeyNames()
$RegKey.Close()
}
else { $InstallKeys=$Reg.EnumKey($HKEY_LOCAL_MACHINE,$RegPath[$i]) | Select-Object -ExpandProperty sNames }
$InstallKeys=@($InstallKeys)


for ($j=0; $j -lt $InstallKeys.Count; $j++) {
if ($Credential -eq $null) {
$AppKey=$Reg.OpenSubKey(($RegPath[$i]+"\\"+$InstallKeys[$j]))
$Result=New-Object -Type PSObject -Property @{ComputerName=$ComputerName;
DisplayName=$AppKey.GetValue("DisplayName");
Publisher=$AppKey.GetValue("Publisher");
InstallDate=$AppKey.GetValue("InstallDate");
DisplayVersion=$AppKey.GetValue("DisplayVersion");
UninstallString=$AppKey.GetValue("UninstallString")}
$AppKey.Close()
}
else {
$Result=New-Object -Type PSObject -Property @{ComputerName=$ComputerName;
DisplayName=$Reg.GetStringValue($HKEY_LOCAL_MACHINE,($RegPath[$i]+"\"+$InstallKeys[$j]),"DisplayName").sValue;
Publisher=$Reg.GetStringValue($HKEY_LOCAL_MACHINE,($RegPath[$i]+"\"+$InstallKeys[$j]),"Publisher").sValue;
InstallDate=$Reg.GetStringValue($HKEY_LOCAL_MACHINE,($RegPath[$i]+"\"+$InstallKeys[$j]),"InstallDate").sValue;
DisplayVersion=$Reg.GetStringValue($HKEY_LOCAL_MACHINE,($RegPath[$i]+"\"+$InstallKeys[$j]),"DisplayVersion").sValue;
UninstallString=$Reg.GetStringValue($HKEY_LOCAL_MACHINE,($RegPath[$i]+"\"+$InstallKeys[$j]),"UninstallString").sValue;}
}
if ($Result.DisplayName -ne $null) { $Results+=$Result }
}
}
if ($Credential -eq $null ) { $Reg.Close() }
$Results
}


End { Write-Verbose "Exiting $($PSCmdlet.MyInvocation.MyCommand.Name)" }
}


$NetSDK=Get-InstalledApps | Where-Object { $_.DisplayName -like "*.NET Core SDK*" } | Sort-Object -Property DisplayVersion -Descending | Select-Object -First 1
$NetHost=Get-InstalledApps | Where-Object { $_.DisplayName -like "*ASP.NET Core*" } | Sort-Object -Property DisplayVersion -Descending | Select-Object -First 1
$NetSDK
$NetHost

在windows上,我检查了注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET Core\Shared Framework\v5.0\5.0.12

——在CMD

对于。net框架

wmic product get description | findstr /C:".NET Framework

对于。net Core

dotnet --info

我来这里是为了寻找一种程序化的方法来确定这一点;虽然这个问题有很多好的答案,但似乎没有一个是程序化的。

我用c#做了一个小文件,解析dotnet.exe --list-runtimes的输出,可以很容易地适应你的需要。它使用CliWrap nuget包;你可能不需要它,但我已经在我的项目中使用了它,因为它使命令行处理更容易满足我的需求。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using CliWrap;
using CliWrap.EventStream;


// License: Do whatever you want with this. This is what my project uses,
// I make no guarantees it works or will work in the future
// THIS IS ONLY FOR .NET CORE DETECTION (no .NET framework!)
// Requires CliWrap https://github.com/Tyrrrz/CliWrap


namespace DotnetHelper
{
/// <summary>
/// Class that can determine if a version of .NET Core is installed
/// </summary>
public class DotNetRuntimeVersionDetector
{
/// <summary>
/// This is very windows specific
/// </summary>
/// <param name="desktopVersionsOnly">If it needs to filter to Windows Desktop versions only (WPF/Winforms).</param>
/// <returns>List of versions matching the specified version</returns>
public static async Task<Version[]> GetInstalledRuntimeVersions(bool desktopVersion)
{
// No validation. Make sure exit code is checked in the calling process.
var cmd = Cli.Wrap(@"dotnet.exe").WithArguments(@"--list-runtimes").WithValidation(CommandResultValidation.None);
var runtimes = new List<Version>();
await foreach (var cmdEvent in cmd.ListenAsync())
{
switch (cmdEvent)
{
case StartedCommandEvent started:
break;
case StandardOutputCommandEvent stdOut:
if (string.IsNullOrWhiteSpace(stdOut.Text))
{
continue;
}


if (stdOut.Text.StartsWith(@"Microsoft.NETCore.App") && !desktopVersion)
{
runtimes.Add(parseVersion(stdOut.Text));
}
else if (stdOut.Text.StartsWith(@"Microsoft.WindowsDesktop.App") && desktopVersion)
{
runtimes.Add(parseVersion(stdOut.Text));
}
break;
case StandardErrorCommandEvent stdErr:
break;
case ExitedCommandEvent exited:
break;
}
}


return runtimes.ToArray();
}


private static Version parseVersion(string stdOutText)
{
var split = stdOutText.Split(' ');
return Version.Parse(split[1]); // 0 = SDK name, 1 = version, 2+ = path parts
}
}
}