27 votes

Collections génériques Powershell

J'ai poussé dans le framework .Net en PowerShell et j'ai touché quelque chose que je ne comprends pas. Cela fonctionne bien:

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

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

Cela ne signifie cependant pas:

 16# $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]"
 

Ils sont tous les deux dans la même assemblée, alors qu'est-ce qui me manque?

EDIT: Comme cela a été souligné dans les réponses, ce n'est à peu près qu'un problème avec PowerShell v1.

67voto

ShanePowser Points 461

Dans Powershell 2.0, la nouvelle façon de créer un Dictionary est:

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

17voto

tomasr Points 9990

Le dictionnaire n'est pas définie dans la même assemblée que SortedDictionary. On est dans mscorlib et l'autre dans system.dll.

C'est là que réside le problème. Le comportement actuel en powershell est que lors de la résolution du générique paramètres spécifiés, si les types ne sont pas pleinement qualifiés noms de type, et il lui suppose qu'ils sont dans la même assemblée que le type générique que vous essayez de les instancier.

Dans ce cas, cela signifie qu'elle est à la recherche pour le Système.Chaîne en System.dll et pas dans mscorlib, donc il échoue.

La solution est de spécifier le nom d'assembly pleinement qualifié pour le générique des types de paramètres. C'est extrêmement laid, mais qui fonctionne:

$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]]"

4voto

Steven Murawski Points 6665

Il existe certains problèmes avec les génériques dans PowerShell. Lee Holmes, un développeur de l'équipe PowerShell a publié ce script pour créer des génériques.

Je n'ai pas le temps de tester pour le moment, mais je vais l'essayer ce soir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X