我知道Powershell可以调用.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...)
而且我知道在C#中您可以重载函数,就像SharpSvn库的SvnClient.Update() method一样:
Update(ICollection(String))
-递归地将指定路径更新为最新的(HEAD)修订版Update(String)
-以递归方式将指定路径更新为最新的(HEAD)修订版Update(ICollection(String), SvnUpdateArgs)
-将指定路径更新为指定的修订版Update(ICollection(String), SvnUpdateResult)
-递归地将指定路径更新为最新的(HEAD)修订版Update(String, SvnUpdateArgs)
-递归更新指定路径Update(String, SvnUpdateResult)
-以递归方式将指定路径更新为最新的(HEAD)修订版Update(ICollection(String), SvnUpdateArgs, SvnUpdateResult)
-将指定路径更新为指定的修订版Update(String, SvnUpdateArgs, SvnUpdateResult)
-以递归方式将指定路径更新为最新的(HEAD)修订版但是,如果我们要将所有这些放在一起怎么办?如果说要调用第六版的
Update()
,则它需要一个String和一个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
好吧,也许我必须抛弃论点?
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”。 似乎两次类型转换是个问题-最终的类型转换仅覆盖第一次的类型转换,它们并不互补。这是怎么回事吗?有没有办法两次类型转换东西?是否有另一种方法可以解决此问题?
在此先感谢您的帮助。
最佳答案
这可能不是一个理想的解决方案,但是您可以使用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)