为什么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
- 警告:正如Bacon Bits报道的那样,由于莫名其妙地与旧版本的类捆绑在一起 ,该模块的
-
如果它不可用,您可以尝试以下操作,它会产生一个字符串,例如
"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