【问题标题】:Get path to .NET Framework directory in Powershell在 Powershell 中获取 .NET Framework 目录的路径
【发布时间】:2019-11-27 23:06:51
【问题描述】:

我正在尝试使用此方法获取 .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 目录,但我想知道为什么这种方法不起作用?

【问题讨论】:

  • 在我的运行 ps5.1 的 win7x64 系统上,我得到版本 2.0.5+ 但最新的 目录 实际上是 C:\Windows\Microsoft.NET\Framework64 中的 4.0.3+ - 最新安装的版本4.0.3+ 目录是 4.7.3+。我不知道为什么数字如此不同。
  • 我在 Windows 7 机器上试了一下,得到了相同的结果,当 4 是最新的时它会报告 2.0 目录。但我在 Windows 10 上什么也得不到。我猜它只是出于某种原因不可靠。
  • @prb - 谢谢你的反馈......我很好奇! [咧嘴]

标签: .net powershell msbuild .net-framework-version microsoft.build


【解决方案1】:

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 显然不是“在运行时查找最新安装的框架版本”,它只是一种灵活的方式来指定最新的可用版本在编译时知道(那个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 上没有结果。我确实将 .NET 2.0 作为 Windows 10 上的安装功能,这就是该方法能够找到该框架目录的原因。

要解决此问题,您需要使用更新的Microsoft.Build.Utilities* 程序集,它为每个版本使用一个新名称。在我的系统上,GAC 中有 Microsoft.Build.UtilitiesMicrosoft.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 之后,我使用上面的sn-p 得到了一个更长的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

现在您的原始代码终于返回了 .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 它确实表示“最新安装的框架的版本”,尽管它(当前)返回与传递VersionLatest 相同的路径。

【讨论】:

  • 这个命令对我不起作用Unable to find type [Microsoft.Build.Utilities.ToolLocationHelper].
  • 您是否运行过问题中的Add-Type 命令?
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多