2012-12-19 7 views
8

私は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#で使用すると、関数をオーバーロードすることができます知っている:

  1. Update(ICollection(String)) - 指定されたリビジョン
  2. Update(ICollection(String), SvnUpdateResult)に指定されたパスを更新 - - 再帰的
  3. Update(ICollection(String), SvnUpdateArgs)最新(HEAD)リビジョンに指定されたパスを更新 - 再帰的に最新(HEAD)リビジョン
  4. Update(String)
  5. に指定されたパスを更新します再帰的に指定されたパス
  6. Update(String, SvnUpdateResult)を更新する - - 再帰的に最新(HEAD)に指定されたパスを更新REVI再帰最新(HEAD)リビジョン
  7. Update(String, SvnUpdateArgs)に指定されたパスを更新しますシオン
  8. Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult) - 指定されたリビジョン
  9. Update(String, SvnUpdateArgs, SvnUpdateResult)に指定されたパスを更新 - 再帰的に最新(HEAD)リビジョン

に指定されたパスを更新しますが、私たちは一緒にこのすべてを入れたい場合は何?たとえば、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。この結果、同じ「複数のあいまいなオーバーロード」エラーが発生しました。
  • キャスト$updaterefキャスト$update = [ref]$nullこの結果、エラーが発生します: 'タイプ "System.Management.Automation.PSReference"の "System.Management.Automation.PSReference"値を "SharpSvn.SvnUpdateResult"に変換できません。

最終的なキャストは最初のキャストをオーバーライドしているだけで、互いに補完し合うことはありません。これは何が起こっているのですか?何かを2回キャストする方法はありますか?この問題を回避する別の方法がありますか?

ご協力いただきありがとうございます。

+0

'$ svnclient.Update.OverloadedDefinitions'でオーバーロードされた定義を調べることができますが、そこから呼び出す方法はありません。 –

+0

PowerShellのタイプ変換/メンバ解決の内側の作業について、いくつかの洞察を得る1つの方法は、 'Trace-Command -Nameすべて-Expression {$ svnclient.update($ repopath、[ref] $ update)} -PSHost'を実行し、それは有用な何かを明らかにする。 –

+0

残念ながら、同じ "Multiple ambiguous overloads"というメッセージが返されます。 –

答えて

0

これは理想的な解決策ではないかもしれませんが、Add-Typeを使用してUpdateメソッドをラップするPowerShellフレンドリタイプを作成することができます。

Add-Type -TypeDefinition " 
public class SvnClientEx 
{ 
    public static SvnUpdateResult Update(SvnClient client, string path) 
    { 
     SvnUpdateResult result; 
     client.Update(path, out result); 
     return result; 
    } 
} 
" 

$result = [SvnClient]::Update($svnClient, $repopath) 
+0

'Add-Type:c:\ Users \ autotester \ AppData \ Local \ Temp \ 89jqcyvc.0.cs(4):タイプまたは名前空間名 'SvnClient'が見つかりませんでした。 '' SharpSvn;を使用して定義の先頭に追加しようとしましたが、SharpSvnが見つからないという同様のエラーが発生します。私は何か単純なものが欠けていると確信しています...私はC#一般にはあまりよく知られていません。私は間違って何をしていますか? (そして、ポインタに感謝!) –

+0

Add-TypeのReferencedAssembliesパラメータを見てみましょう。上記のAdd-TypeコマンドにSVNクライアントアセンブリを追加する必要があります。それについて申し訳ありません! –

0

あなたは、単にコードブロックを使用して、このブロック内の結果(アウト)オブジェクトにアクセスすることができます

PS> $repopath = "C:\path\to\localrepo" 
PS> $svnclient.update($repopath, { 
     Write-Host $_.Revision 
     Write-Host $_.HasRevision 
     # Access all the Member and Methods of the result object here 
    }) 
1

これは、権利を取得するのは非常に難しいように見えるん。

これはどのバージョンのPowerShellですか? SvnUpdateArgsSvnUpdateResultは関連しています(つまり、1つのクラスは他のクラスから派生しています)?私はそうしないと思います。私が構築同様のシナリオに基づいて

、PowerShellの現在のバージョン(4.0)で、これは動作しますが、私は思う:

PS> $repopath = "C:\path\to\localrepo" 
PS> [SharpSvn.SvnUpdateResult]$update = $null 
PS> $svnclient.Update([string]$repopath, [ref]$update) 

しかし、私はこれがオーバーロードの1で動作するように得ることができます!?それが偶然であるかどうかわからないけど、これは私が$svnclient.Updateに過負荷の定義を見るために言ったときに最初にリストされた過負荷でした。

私のPowerShellのバージョンでは、2番目の引数を[ref][SharpSvn.SvnUpdateResult]$updateと指定すると、オーバーロードが正しく解決されたように見えますが、メソッドはエラーなく実行されますが、 "out"パラメータに割り当てられたオブジェクトは失われているようです。

$repopathが安全に型宣言されていても、[string]$repopath = "C:\path\to\localrepo"と指定しても、値渡しのときにはまだ[string]$repopathと言わなければならないようです。

0

あなたが行うことができます物事のカップル:

まず、$svnclient.updateによって返された結果はPSMethodです。 PSMethodInvokeメソッドを持っています。あなたはそれを試してみることができます。

第二に、それはあなたが本当の反射を使用することができます動作しない場合:あなたが出てパラメータを指定して呼び出す方法があるときPowerShellで問題があるようです

# To get all methods: 
$svnclient.gettype().getmethods()  

# Then filter the results to get overload you need. 
# Use GetParameters to get parameters of an overloaded method 
# return by GetMethods 
# For example (using PS 3.0 features): 

$svnclient.gettype().getmethods()|? name -eq Update | 
% {write-host "***`n"';$_} | % GetParameters 

# Will list parameter sets for each overload of Update, each set separated by stars 

# Alternatively use getmethod with appropriate parameters  
# GetMethod (link below) can be used to select correct overload without the 
# filtering above. The next to the last overload of GetMethod at the link is the one to use 

# After obtaining correct overload, then call the Invoke method like this: 
$correctOverload.Invoke($svnclient, @($repopath, [ref] $SvnUpdateResult)) 

GetMethod Link

+0

@ micah-r-ledbetter C#CmdLetsまたはこのリフレクションソリューションを書くのが最善の選択肢のようです。私はPowerShellチームにフォローアップの理由を伝えますが、PowerShellの修正版は間もなくリリースされる予定です。 上記の解決策に問題が見つかりました(呼び出し構文が間違っています)。上記の作業を行うための修正プログラムに興味がある場合は、返信してください。 – TravisEz13

関連する問題