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

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 有关系吗?

回答

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

要获取框架版本,请使用以下命令,它返回一个字符串,例如
".NET Framework 4.8.4341.0"

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

笔记:

  • 此属性在 .NET Framework 4.7.1 及更高版本中可用。

    • 警告:正如Bacon Bits报道的那样,由于莫名其妙地与旧版本的类捆绑在一起 ,该模块的 2.0 测试版可能会影响该属性。如果是这样,请升级到最新的稳定版本,即撰写本文时;详情见评论。PSReadLineModule[System.Runtime.InteropServices.RuntimeInformation]2.1
  • 如果它不可用,您可以尝试以下操作,它会产生一个字符串,例如"4.8.04084"[2]

    Get-ItemPropertyValue 'registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftNET Framework SetupNDPv4Full' Version
    
  • 如果这也不起作用,则暗示您的 .NET Framework 版本低于4.5


[1] 在跨平台的 .NET Core / .NET 5+ 版本中,只有一个统一的运行时还包含类库,这[Environment]::Version在 .NET Core 3.0 及更高版本中正确反映。

[2] 奇怪的是,这个版本的修订号与[System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription(如果有的话)报告的版本号不同。还有另一个版本不同的变体,作为InstallPath来自同一注册表项的值的一部分;例如C:WindowsMicrosoft.NETFramework64v4.0.30319


以上是为什么Powershell可以访问较新的.net版本中引入的方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>