我知道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)
    

    10-08 07:59