Question

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

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

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

Ceci ne le fait cependant pas:

$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 deux dans la même assemblée, alors que me manque-t-il?

Comme cela a été souligné dans les réponses, il n’ya quasiment qu’un problème avec PowerShell v1.

Était-ce utile?

La solution

Dictionnaire < K, V > n'est pas défini dans le même assemblage que SortedDictionary < K, V > ;. L’un se trouve dans mscorlib et l’autre dans system.dll.

C'est là que réside le problème. Le comportement actuel dans PowerShell est que, lors de la résolution des paramètres génériques spécifiés, si les types ne sont pas des noms de type pleinement qualifiés, cela suppose en quelque sorte qu'ils se trouvent dans le même assemblage que le type générique que vous tentez d'instancier.

Dans ce cas, cela signifie qu'il recherche System.String dans System.dll et non dans mscorlib, donc il échoue.

La solution consiste à spécifier le nom d'assembly qualifié complet pour les types de paramètres génériques. C'est extrêmement moche, mais ça marche:

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

Autres conseils

Dans PowerShell 2.0, le nouveau moyen de créer un Dictionary est:

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

Certains problèmes liés aux génériques dans PowerShell. Lee Holmes, un développeur de l’équipe PowerShell, a publié ce script pour créer Generics.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top