powershell中的程序集加载行为不一致

powershell中的程序集加载行为不一致,powershell,powershell-2.0,Powershell,Powershell 2.0,我正在调试为什么powershell脚本开始失败,并且它看起来像是在使用Hashset而没有引用System.Core程序集,因此修复程序将以如下方式结束: Add-Type -AssemblyName System.Core $hash = new-object 'System.Collections.Generic.HashSet[string]' 我不知道它以前是如何工作的,在一些机器上仍然运行良好,没有添加类型行。我在这里遗漏了什么?继续David的想法,因为注释中的代码很可怕,所以您

我正在调试为什么powershell脚本开始失败,并且它看起来像是在使用Hashset而没有引用System.Core程序集,因此修复程序将以如下方式结束:

Add-Type -AssemblyName System.Core
$hash = new-object 'System.Collections.Generic.HashSet[string]'

我不知道它以前是如何工作的,在一些机器上仍然运行良好,没有添加类型行。我在这里遗漏了什么?

继续David的想法,因为注释中的代码很可怕,所以您应该检查程序集是否已加载。下面是一个关于检查程序集的小博客

默认情况下,我已加载此程序集。好奇受影响的系统有什么。受影响机器上的.Net framework版本是什么?我的一些3.5代码在Windows更新后停止工作,需要重新安装framework

来自Jeroen Mostert的评论

如果你想说得更准确,你应该确认你已经 拥有.NET自己的
系统.Core
,而不是任何老冒名顶替者,然后 没有必要检查已经发生了什么<代码>添加类型 -AssemblyName“System.Core,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”


检查$profile以查看它是否正在这些机器上加载该程序集?不同的PowerShell版本?@NathanTuggy我仔细检查,两台机器上都没有配置文件。@ojk两台机器上都有相同的PowerShell版本。我猜程序集以前是由另一台机器上的另一个应用程序加载的。试试[appdomain]:<代码>添加类型-AssemblyName“System.Core,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”本身就足够了(版本策略将在必要时负责加载更高版本)。@JeroenMostert良好计划。我的看起来像是
System.Core,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089
不确定op需要哪一个。谢谢我仍然不确定是否应该删除它。因为
HashSet
存在于3.5中,所以我会使用它来最大化脚本运行的机会。当然,除非您特别需要.NET 4.0,但这并不是因为
HashSet
。问题是,如果默认环境已经加载了
System.Core,Version=4.0.0.0,…
,并且如果您有PowerShell 4.0,该程序集应该自动加载,AFAIK——那么
添加类型
将失败:(请参阅
-Name
参数)@BaconBits:除非这不是真的。我在自己的系统上进行了尝试,尝试加载
系统的3.5版时,
添加类型
完全没有失败。Core
是4.0版已经加载(Powershell 3.0)。这是有道理的,因为在.NET4.0上要求3.5只会让你得到4.0,这是版本控制政策的恩赐。
If (!(([appdomain]::currentdomain.GetAssemblies()).FullName -match "System\.Core")){
    Add-Type -AssemblyName System.Core
}
$hash = new-object 'System.Collections.Generic.HashSet[string]'