PowerShell中的系统DLL何时需要显式添加类型调用



在编写使用System.DirectoryServices.AccountManagement中项目的PowerShell脚本时,我注意到我的脚本在PowerShell Desktop和PowerShell Core上运行时存在差异。

此命令在没有显式程序集加载的PowerShell Core上工作:

$context = [System.DirectoryServices.AccountManagement.PrincipalContext]::new(
[System.DirectoryServices.AccountManagement.ContextType]::Domain, 
$Domain)

但是,完全相同的命令在PowerShell Classic上失败,错误为:

Unable to find type [System.DirectoryServices.AccountManagement.PrincipalContext].

但是,如果我手动加载该类型(通过Add-Type -AssemblyName System.DirectoryServices.AccountManagement(,它在PowerShell Classic上运行良好。

奇怪的是,我的脚本使用了大量其他.NET程序集,所有这些程序集在Classic和Core中都可以在没有显式Add-Type调用的情况下正常加载。

对于哪些程序集必须通过Add-Type导入,哪些程序集可以隐式加载,是否有一套明确的规则?

根据PowerShell文档repo中的此问题:https://github.com/MicrosoftDocs/PowerShell-Docs/issues/6422#issuecomment-668293431

  • 在Windows PowerShell(即5.1及以下版本(中,您需要对任何尚未加载的内容使用Add Type。这主要适用于涉及GAC程序集的场景,您可以通过名称而不是路径来指定这些程序集
  • 在PS 6+中,没有GAC。但PowerShell现在在$PSHome中提供自己的程序集。这些程序集是应请求自动加载的,因此不需要添加类型,但仍然允许这样做(它允许您编写与Windows PowerShell隐式兼容的脚本,如上面给出的示例(
  • 由于没有GAC,因此PS 6+实际上不需要使用Add Type
  • 从任意路径加载程序集仍然需要添加类型,因为否则将不会发现这些程序集

看起来PowerShell文档将使用新信息进行更新。

最新更新