Wie kann ich eine überladene .NET-Funktion aufrufen, die ein C # out-Argument von Powershell verwendet?

8

Ich weiß, dass Powershell .NET-Code aufrufen kann, der so aussehen könnte

%Vor%

Und ich weiß, dass, wo C # out Argumente hat, Powershell [ref] Argumente hat, was wie folgt aussehen könnte:

%Vor%

Und ich weiß, dass Sie in C # Funktionen überladen können, wie die SharpSvn-Bibliothek für ihre SvnClient.Update () Methode :

  1. Update(ICollection(String)) - Aktualisiert die angegebenen Pfade rekursiv auf die neueste (HEAD) Revision
  2. Update(String) - Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision
  3. Update(ICollection(String), SvnUpdateArgs) - Aktualisiert die angegebenen Pfade auf die angegebene Version
  4. Update(ICollection(String), SvnUpdateResult) - Aktualisiert die angegebenen Pfade rekursiv auf die neueste (HEAD) Revision
  5. Update(String, SvnUpdateArgs) - Aktualisiert den angegebenen Pfad rekursiv
  6. Update(String, SvnUpdateResult) - Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision
  7. Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult) - Aktualisiert die angegebenen Pfade auf die angegebene Version
  8. Update(String, SvnUpdateArgs, SvnUpdateResult) - Aktualisiert den angegebenen Pfad rekursiv auf die letzte (HEAD) Revision

Aber was, wenn wir das alles zusammenfügen wollen? Wenn ich zum Beispiel die 6. Version von Update() aufrufen möchte, diejenige, die einen String und ein SvnUpdateResult verwendet, wobei SvnUpdateResult ein C # out-Objekt ist? Mein erster Instinkt war, so etwas zu versuchen:

%Vor%

OK, vielleicht muss ich die Argumente werfen?

%Vor%

Aber das scheint auch nicht zu funktionieren. Andere Dinge, die ich versucht habe:

  • casting $update als [SharpSvn.SvnUpdateResult][ref] - das heißt, die Reihenfolge, in der ich sie gewirkt habe, wird umgekehrt. Dies führt zu einem Fehler, der besagt: "[ref] kann nur der letzte Typ in der Typumwandlungsfolge sein."
  • Casting $update bis SharpSvn.SvnUpdateResult vor der Verwendung: $update = [SharpSvn.SvnUpdateResult]$null . Dies führt zu demselben Fehler "Mehrere mehrdeutige Überladungen", auf den ich oben hingewiesen habe
  • Casting $update bis ref vor der Verwendung: $update = [ref]$null . Dies führt zu einem Fehler: 'Der Wert "System.Management.Automation.PSReference" des Typs "System.Management.Automation.PSReference" kann nicht in "SharpSvn.SvnUpdateResult" geschrieben werden.'

Es sieht so aus, als ob es zweimal geworfen wurde - das Finale überlagert die erste Besetzung, sie ergänzen sich nicht. Ist das was passiert? Gibt es eine Möglichkeit, etwas zweimal zu werfen? Gibt es einen anderen Weg, um dieses Problem zu umgehen?

Vielen Dank im Voraus für jede Hilfe.

    
Micah R Ledbetter 19.12.2012, 18:42
quelle

5 Antworten

1

Das scheint ziemlich schwer zu sein.

Welche Version von PowerShell ist das? Sind SvnUpdateArgs und SvnUpdateResult verwandt (d. H. Eine Klasse ist von der anderen abgeleitet)? Ich nehme nicht an.

Basierend auf einem ähnlichen Szenario, das ich mit der aktuellen Version (4.0) von PowerShell erstellt habe, funktioniert das, denke ich:

%Vor%

Allerdings konnte ich nur mit einer der Überladungen arbeiten!? Nicht sicher, ob es zufällig ist, aber das war die Überlastung, die zuerst aufgeführt wurde, als ich $svnclient.Update ansprach Siehe die Überladungsdefinitionen.

Wenn ich in meiner Version von PowerShell das zweite Argument als [ref][SharpSvn.SvnUpdateResult]$update gebe, scheint die Überladung korrekt gelöst zu sein, die Methode läuft ohne Fehler, aber das dem Parameter "out" zugewiesene Objekt scheint verloren zu sein / p>

Auch wenn $repopath typsicher deklariert ist als [string]$repopath = "C:\path\to\localrepo" , müssen wir noch [string]$repopath sagen, wenn wir es übergeben (nach Wert).

    
Jeppe Stig Nielsen 04.06.2015 11:23
quelle
1

Es scheint ein Problem in PowerShell zu geben, wenn es eine Methode gibt, die Sie mit einem out-Parameter einer Klasse aufrufen, und eine andere Überladung mit einer ähnlichen Signatur (die Klasse kann jede Klasse in dieser Signatur sein.)

Ich habe für dieses Problem eine einfache Repro erstellt und ein Problem für PowerShell gemeldet.

    
TravisEz13 28.12.2016 04:27
quelle
0

Dies ist möglicherweise keine ideale Lösung, aber Sie könnten Add-Type verwenden und einen PowerShell-freundlichen Typ erstellen, der die Update-Methode umschließt.

%Vor%     
Adam Driscoll 23.12.2012 20:05
quelle
0

Sie können einfach einen Codeblock verwenden und auf das Ergebnisobjekt in diesem Block zugreifen:

%Vor%     
CodeSeavers 19.05.2015 13:11
quelle
0

Ein paar Dinge, die Sie tun könnten:

Erstens ist das von $svnclient.update zurückgegebene Ergebnis ein PSMethod . PSMethod hat eine Invoke -Methode. Du könntest versuchen, es zu benutzen.

Zweitens, wenn das nicht funktioniert, könntest du echte Reflektion benutzen:

%Vor%

GetMethod Link

    
Χpẘ 26.10.2015 14:57
quelle