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.

War es hilfreich?

Lösung

Dictionary ist nicht in der gleichen Baugruppe definiert als SortedDictionary . Eine davon ist in mscorlib und die andere in system.dll.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top