Ich versuche die PowerShell-Klassen zu verwenden, was sehr praktisch ist, um zusammengehörige Daten zu gruppieren Verhalten. Das vereinfachte Szenario: Ein PS-Skript, das die Klasse definiert, und ein anderes Skript, das diese Klasse verwendet.PowerShell 5 und Klassen - Der "X" -Wert des Typs "X" kann nicht in "X" konvertiert werden
Common.ps1
class X
{
[string] $A
}
Script1.ps1
. $PSScriptRoot\Common.ps1
[X] $v = New-Object X
Alles ist gut - kann man Script1.ps1
beliebig viele Male ohne Probleme laufen - bis Sie make beliebig chang e in Common.ps1
. Ihnen wird der folgende Fehler angezeigt.
Cannot convert the "X" value of type "X" to type "X". At D:\temp\PSIssue\Script1.ps1:3 char:1 + [X] $v = New-Object X + ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException + FullyQualifiedErrorId : RuntimeException
Vorstellbar jede Änderung (auch wenn Sie nur Leerzeichen hinzugefügt) in PS-Datei zwingt seine erneute Kompilierung, so dass Typ X
anders wird als X
sie verwendet werden - temporäre Behälteranordnung (ganz gleich geändert wurde Problem leicht reproduzierbar in .NET - Typen sind identisch, solange "Vollqualifizierte Assembly-Namen" gleich sind. Änderung in Script1.ps1
lässt Dinge wieder normal funktionieren.
Gibt es eine Möglichkeit, solche Probleme zu überwinden?
Ja nicht zwei derselben Runspace/session/Appdomain in, verwenden verschiedene Implementierungen von 'X' (dh . 'exit' powershell, re-launch) –
@ MathiasR.Jessen, gibt es eine Möglichkeit in PowerShell ISE alles neu zu laden/neu zu kompilieren? Ich schließe es gerade komplett und öffne es von Grund auf neu ... –
Wenn Sie den Fehler ignorieren und das Skript nur ein zweites Mal ausführen, bekomme ich den Fehler nicht und laufe erneut, dann bekomme ich die aktualisierte Klasse. Sollte für feine Tests in Ordnung sein. – Matt