Общие коллекции PowerShell - PullRequest
       43

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

35 голосов
/ 08 октября 2008

Я втолкнулся в .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.

Ответы [ 3 ]

81 голосов
/ 04 февраля 2010

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

$object = New-Object 'system.collections.generic.dictionary[string,int]'
17 голосов
/ 09 октября 2008

Словарь не определен в той же сборке, что и SortedDictionary . Один находится в 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]]"
4 голосов
/ 09 октября 2008

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

...