在 Powershell 中获取 .NET Framework 目录的路径
Get path to .NET Framework directory in Powershell
我正在尝试使用此方法获取 .NET Framework 目录(例如 C:\Windows\Microsoft.NET\v4.0.30319
)
Add-Type -AssemblyName Microsoft.Build.Utilities
$dotNetDir = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
但是,它什么也没返回。没有错误,只是空白。
我知道还有其他方法可以获取 .NET 目录,但我想知道为什么这种方法不起作用?
TL;DR Microsoft.Build.Utilities
程序集不支持高于 2.0 的框架版本。使用较新的程序集以获得对较新框架版本的支持。
在 64 位 Windows 10 Professional 我得到以下输出...
PS> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS> [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
C:\Windows\Microsoft.NET\Framework\v2.0.50727
我还注意到 VersionLatest
枚举值是 Version20
...
的别名
PS> [Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest
Version20
也就是说,VersionLatest
显然并不意味着 "find the latest installed framework version at runtime",它只是一种灵活的方式来指定最新的可用版本 已知于 compile-time(那个 Microsoft.Build.Utilities
集会),其中没有很多...
PS> $enumType = [Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]
PS> [Enum]::GetNames($enumType) `
| ForEach-Object -Process {
$value = $enumType::$_;
New-Object -TypeName 'PSCustomObject' -Property (
[Ordered] @{
Name = $_;
ValueText = $value;
ValueInt32 = [Int32] $value
}
)
}
Name ValueText ValueInt32
---- --------- ----------
Version11 Version11 0
Version20 Version20 1
VersionLatest Version20 1
关于您在不同操作系统上看到的结果,Windows 7 默认安装了 .NET 2.0,如果我记得的话,Windows 10 默认安装了 .NET 4.0 但没有安装 2.0 ,所以如果你没有改变任何可以解释为什么你在 Windows 7 上得到过时结果而在 Windows 10 上没有结果的原因。我确实在 [=59= 上安装了 .NET 2.0 作为功能] 10,这就是该方法能够找到该框架目录的原因。
要解决此问题,您需要使用更新的 Microsoft.Build.Utilities*
程序集,它为每个版本使用一个新名称。在我的系统上,我在 GAC 中有 Microsoft.Build.Utilities
和 Microsoft.Build.Utilities.v3.5
,但后者最多只支持 .NET 3.5。相反,我安装了 Microsoft.Build.Utilities.Core
from NuGet...
PS> Install-Package -Name 'Microsoft.Build.Utilities.Core' -ProviderName 'NuGet'
将 Microsoft.Build.Utilities.Core.dll
及其依赖项传递给 Add-Type
后,我使用上面的代码片段得到了一个更长的 Microsoft.Build.Utilities.TargetDotNetFrameworkVersion
值列表...
Name ValueText ValueInt32
---- --------- ----------
Version11 Version11 0
Version20 Version20 1
Version30 Version30 2
Version35 Version35 3
Version40 Version40 4
Version45 Version45 5
Version451 Version451 6
Version46 Version46 7
Version461 Version461 8
Version452 Version452 9
Version462 VersionLatest 10
VersionLatest VersionLatest 10
Version47 Version47 11
Version471 Version471 12
Version472 Version472 13
Latest Latest 9999
现在您的原始代码终于 returns .NET 4.0 的目录...
PS> [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
我注意到还有一个新的 Latest
枚举值 looks like 它确实意味着 "the version of the latest installed framework",尽管它(当前)returns 与通过 VersionLatest
.
我正在尝试使用此方法获取 .NET Framework 目录(例如 C:\Windows\Microsoft.NET\v4.0.30319
)
Add-Type -AssemblyName Microsoft.Build.Utilities
$dotNetDir = [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
但是,它什么也没返回。没有错误,只是空白。
我知道还有其他方法可以获取 .NET 目录,但我想知道为什么这种方法不起作用?
TL;DR Microsoft.Build.Utilities
程序集不支持高于 2.0 的框架版本。使用较新的程序集以获得对较新框架版本的支持。
在 64 位 Windows 10 Professional 我得到以下输出...
PS> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.145
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.145
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS> [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
C:\Windows\Microsoft.NET\Framework\v2.0.50727
我还注意到 VersionLatest
枚举值是 Version20
...
PS> [Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest
Version20
也就是说,VersionLatest
显然并不意味着 "find the latest installed framework version at runtime",它只是一种灵活的方式来指定最新的可用版本 已知于 compile-time(那个 Microsoft.Build.Utilities
集会),其中没有很多...
PS> $enumType = [Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]
PS> [Enum]::GetNames($enumType) `
| ForEach-Object -Process {
$value = $enumType::$_;
New-Object -TypeName 'PSCustomObject' -Property (
[Ordered] @{
Name = $_;
ValueText = $value;
ValueInt32 = [Int32] $value
}
)
}
Name ValueText ValueInt32
---- --------- ----------
Version11 Version11 0
Version20 Version20 1
VersionLatest Version20 1
关于您在不同操作系统上看到的结果,Windows 7 默认安装了 .NET 2.0,如果我记得的话,Windows 10 默认安装了 .NET 4.0 但没有安装 2.0 ,所以如果你没有改变任何可以解释为什么你在 Windows 7 上得到过时结果而在 Windows 10 上没有结果的原因。我确实在 [=59= 上安装了 .NET 2.0 作为功能] 10,这就是该方法能够找到该框架目录的原因。
要解决此问题,您需要使用更新的 Microsoft.Build.Utilities*
程序集,它为每个版本使用一个新名称。在我的系统上,我在 GAC 中有 Microsoft.Build.Utilities
和 Microsoft.Build.Utilities.v3.5
,但后者最多只支持 .NET 3.5。相反,我安装了 Microsoft.Build.Utilities.Core
from NuGet...
PS> Install-Package -Name 'Microsoft.Build.Utilities.Core' -ProviderName 'NuGet'
将 Microsoft.Build.Utilities.Core.dll
及其依赖项传递给 Add-Type
后,我使用上面的代码片段得到了一个更长的 Microsoft.Build.Utilities.TargetDotNetFrameworkVersion
值列表...
Name ValueText ValueInt32
---- --------- ----------
Version11 Version11 0
Version20 Version20 1
Version30 Version30 2
Version35 Version35 3
Version40 Version40 4
Version45 Version45 5
Version451 Version451 6
Version46 Version46 7
Version461 Version461 8
Version452 Version452 9
Version462 VersionLatest 10
VersionLatest VersionLatest 10
Version47 Version47 11
Version471 Version471 12
Version472 Version472 13
Latest Latest 9999
现在您的原始代码终于 returns .NET 4.0 的目录...
PS> [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
我注意到还有一个新的 Latest
枚举值 looks like 它确实意味着 "the version of the latest installed framework",尽管它(当前)returns 与通过 VersionLatest
.