Powershell generische Sammlungen
-
06-07-2019 - |
Frage
Ich habe in den .NET-Framework in Powershell drängt, und ich habe etwas getroffen, die ich nicht verstehe. Dies funktioniert:
$foo = New-Object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
$foo.Add("FOO", "BAR")
$foo
Key Value
--- -----
FOO BAR
Dies ist jedoch nicht:
$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]"
Sie sind beide in der gleichen Versammlung, also was soll ich fehle?
Wie in den Antworten darauf hingewiesen, das ist so ziemlich nur ein Problem mit Powershell v1.
Lösung
Dictionary
Darin liegt das Problem. Das aktuelle Verhalten in Powershell ist, dass bei der Lösung des generischen Parameters angegeben, wenn die Typen nicht voll qualifizierte Typnamen sind, es ist eine Art davon aus, dass sie in der gleichen Anordnung wie der generischen Typ sind Sie zu instanziiert versuchen.
In diesem Fall bedeutet es sucht nach System.String in System.dll, und nicht in mscorlib, so ist es nicht.
Die Lösung ist die vollständig qualifizierten Namen der Assembly für die generischen Parametertypen angeben. Es ist extrem hässlich, aber funktioniert:
$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]]"
Andere Tipps
In Powershell 2.0 die neue Art und Weise eine Dictionary
zu erstellen ist:
$object = New-Object 'system.collections.generic.dictionary[string,int]'
Es gibt einige Probleme mit Generics in Powershell. Lee Holmes, ein Entwickler auf dem Powershell-Team geschrieben dieses Skript Generics zu erstellen.