私はPowerShellは、.NETコードを呼び出すことができます。このPowershellのC#out引数を使用するオーバーロードされた.NET関数を呼び出すにはどうすればよいですか?
PS> [Reflection.Assembly]::LoadFile(($ScriptDir + ".\SharpSvn-x64\SharpSvn.dll"))
PS> $SvnClient = New-Object SharpSvn.SvnClient
のように見えるかもしれないと私はC#はout
の引数を持つ場合、PowerShellは次のようになります[ref]
引数が、持っていることを知っていることを知っている:
PS> $info = $null
PS> $SvnClient.GetInfo($repo.local, ([ref]$info))
True
PS> $info
(...long output snipped...)
NodeKind : Directory
Revision : 16298
Uri : http://server/path/to/remoterepo
FullPath : C:\path\to\localrepo
(...long output snipped...)
を
そしてSharpSvnライブラリはそのSvnClient.Update() methodの場合と同様に、私は、C#で使用すると、関数をオーバーロードすることができます知っている:
Update(ICollection(String))
- 指定されたリビジョンUpdate(ICollection(String), SvnUpdateResult)
に指定されたパスを更新 - - 再帰的Update(ICollection(String), SvnUpdateArgs)
最新(HEAD)リビジョンに指定されたパスを更新 - 再帰的に最新(HEAD)リビジョン- に指定されたパスを更新します再帰的に指定されたパス
Update(String, SvnUpdateResult)
を更新する - - 再帰的に最新(HEAD)に指定されたパスを更新REVI再帰最新(HEAD)リビジョンUpdate(String, SvnUpdateArgs)
に指定されたパスを更新しますシオンUpdate(ICollection(String), SvnUpdateArgs, SvnUpdateResult)
- 指定されたリビジョンUpdate(String, SvnUpdateArgs, SvnUpdateResult)
に指定されたパスを更新 - 再帰的に最新(HEAD)リビジョン
Update(String)
に指定されたパスを更新しますが、私たちは一緒にこのすべてを入れたい場合は何?たとえば、Update()
という6番目のバージョンを呼び出す場合は、文字列とSvnUpdateResultを取ります.SvnUpdateResultはC#の出力オブジェクトです。私の最初の本能は、次のようなものを試してみることでした:
PS> $repopath = "C:\path\to\localrepo"
PS> $update = $null
PS> $svnclient.update($repopath, [ref]$update)
Multiple ambiguous overloads found for "Update" and the argument count: "2".
At line:1 char:18
+ $svnclient.update <<<< ($repopath, [ref]$update)
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
OK、多分私は引数をキャストする必要がありますか?
PS> $svnclient.update([string]$repopath, [ref][SharpSvn.SvnUpdateResult]$update)
Multiple ambiguous overloads found for "Update" and the argument count: "2".
At line:1 char:18
+ $svnclient.update <<<< ([string]$repopath, [ref][SharpSvn.SvnUpdateResult]$update)
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
しかし、それはどちらかと思われません。私が試した他のもの:$update
[SharpSvn.SvnUpdateResult][ref]
としての鋳造
- は - つまり、順序を逆に私はそれをキャストしていること。その結果、次のようなエラーが発生します。「[ref]は型変換シーケンスの最終型のみになります。
- キャスト
$update
~SharpSvn.SvnUpdateResult
使用前:$update = [SharpSvn.SvnUpdateResult]$null
。この結果、同じ「複数のあいまいなオーバーロード」エラーが発生しました。 - キャスト
$update
〜ref
キャスト$update = [ref]$null
この結果、エラーが発生します: 'タイプ "System.Management.Automation.PSReference"の "System.Management.Automation.PSReference"値を "SharpSvn.SvnUpdateResult"に変換できません。
最終的なキャストは最初のキャストをオーバーライドしているだけで、互いに補完し合うことはありません。これは何が起こっているのですか?何かを2回キャストする方法はありますか?この問題を回避する別の方法がありますか?
ご協力いただきありがとうございます。
'$ svnclient.Update.OverloadedDefinitions'でオーバーロードされた定義を調べることができますが、そこから呼び出す方法はありません。 –
PowerShellのタイプ変換/メンバ解決の内側の作業について、いくつかの洞察を得る1つの方法は、 'Trace-Command -Nameすべて-Expression {$ svnclient.update($ repopath、[ref] $ update)} -PSHost'を実行し、それは有用な何かを明らかにする。 –
残念ながら、同じ "Multiple ambiguous overloads"というメッセージが返されます。 –