Подтвердить что ты не робот

Общие коллекции PowerShell

Я вставлял .NET Framework в PowerShell, и я ударил то, что я не понимаю. Это отлично работает:

$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$foo.Add("FOO", "BAR")
$foo

Key                                                         Value
---                                                         -----
FOO                                                         BAR

Однако это не так:

$bar = New-Object "System.Collections.Generic.SortedDictionary``2[System.String,System.String]"
New-Object : Cannot find type [System.Collections.Generic.SortedDictionary`2[System.String,System.String]]: make sure t
he assembly containing this type is loaded.
At line:1 char:18
+ $bar = New-Object <<<< "System.Collections.Generic.SortedDictionary``2[System.String,System.String]"

Они оба находятся в одной сборке, поэтому что мне не хватает?

Как было указано в ответах, это почти проблема только с PowerShell v1.

4b9b3361

Ответ 1

Словарь < K, V > не определен в той же сборке, что и SortedDictionary < K, V > . Один из них находится в mscorlib, а другой - в system.dll.

В этом и заключается проблема. Текущее поведение в PowerShell заключается в том, что при разрешении указанных общих параметров, если типы не являются полностью квалифицированными именами типов, это предполагает, что они находятся в той же сборке, что и общий тип, который вы пытаетесь создать.

В этом случае это означает, что он ищет System.String в System.dll, а не в mscorlib, поэтому он терпит неудачу.

Решение состоит в том, чтобы указать полное имя сборки для общих типов параметров. Это очень уродливо, но работает:

$bar = new-object "System.Collections.Generic.Dictionary``2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

Ответ 2

В PowerShell 2.0 новый способ создания Dictionary:

$object = New-Object 'system.collections.generic.dictionary[string,int]'

Ответ 3

Есть некоторые проблемы с Generics в PowerShell. Ли Холмс, разработчик PowerShell, опубликовал этот script для создания Generics.