在Powershell中获取.NET Framework目录的路径

PRB

我正在尝试使用此方法来获取.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; DRMicrosoft.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上却没有结果。我在Windows 10上确实具有.NET 2.0作为已安装的功能,这就是为什么该方法能够找到该框架目录的原因。

要解决此问题,您需要使用更新的Microsoft.Build.Utilities*程序集,该程序集为每个版本使用新名称。在我的系统有Microsoft.Build.UtilitiesMicrosoft.Build.Utilities.v3.5在GAC,但后者只.NET 3.5支持了。相反,我Microsoft.Build.Utilities.Core从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

现在您的原始代码终于返回了.NET 4.0的目录...

PS> [Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToDotNetFramework([Microsoft.Build.Utilities.TargetDotNetFrameworkVersion]::VersionLatest)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319

我注意到还有一个新的Latest枚举值,尽管它(当前)返回的路径与pass相同,但看起来确实确实意味着“最新安装的框架的版本” VersionLatest

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章