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

When is an Explicit Add-Type Call Required for a System DLL in PowerShell?

在编写使用 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 文档存储库中的这个问题:https://github.com/MicrosoftDocs/PowerShell-Docs/issues/6422#issuecomment-668293431

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

PowerShell 文档似乎将使用新信息进行更新。