为什么Powershell可以访问较新的.net版本中引入的方法?

xqkwcwgp  于 2022-12-18  发布在  Shell
关注(0)|答案(1)|浏览(84)

Powershell v5.1似乎使用了.Net Framework v4.0

[Environment]::Version
# Major  Minor  Build  Revision
# -----  -----  -----  --------
# 4      0      30319  42000

DateTimeOffset.FromUnixTimeSeconds方法需要.Net Framework v4.6+,所以基本上Powershell v5.1不应该访问它。

[DateTimeOffset]|Get-Member -Static -Name FromUnixTimeSeconds
# TypeName: System.DateTimeOffset
# Name                MemberType Definition
# ----                ---------- ----------
# FromUnixTimeSeconds Method     static System.DateTimeOffset FromUnixTimeSeconds(long seconds)

为什么我可以调用它?它是否与C# AssemblyVersion & AssemblyFileVersion有关?

of1yzvn4

of1yzvn41#

[Environment]::Version报告CLR 运行时 )版本,该版本.NET Framework 版本不同,后者是基于给定CLR版本构建的独立版本控制类库[1]。

要获取 *framework版本 *,请使用the following,它返回一个 * 字符串 *,例如
.NET Framework 4.8.4341.0

[System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription

注:

  • 此属性在.NET Framework *4.7.1及更高版本 * 中可用,并且最新Windows版本中的Windows PowerShell是基于v4.8构建的。
    *注意事项:正如Bacon Bits报告的那样,PSReadLineModule module2.0版本可能会“隐藏”该属性,因为它莫名其妙地与[System.Runtime.InteropServices.RuntimeInformation]类的旧版本捆绑在一起。Windows 11 22 H2 * 之前的Windows PowerShell版本附带 * 2.0,因此您必须手动将PSReadLine模块升级到2.1或更高版本2.2.6是撰写本文时的最新版本),例如使用

Install-Module -Force PSReadLine -Scope CurrentUser;详见注解。

  • 如果它不可用,您可以尝试以下操作,它将生成一个字符串,如"4.8.04084":[2]
Get-ItemPropertyValue 'registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' Version
  • 如果这也不起作用,则意味着您的.NET Framework版本低于 4.5

[1]在跨平台的.NET Core / .NET 5+版本中,只有一个 * 统一运行时 * 还包括类库,[Environment]::Version在.NET Core 3.0和更高版本中正确地反映了类库。
[2]奇怪的是,这个版本与[System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription(如果有的话)报告的版本号不同,还有另一个版本不同的变体,作为来自同一注册表项的InstallPath值的一部分;例如C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

相关问题