首页 > 解决方案 > Powershell 与 C# 互操作,可以通过引用传递吗?

问题描述

我试图让 Powershell 委托在从 C# 类调用时成功更改传递引用参数。我是一个 Powershell 人,而不是 C#,你看 :)

以下代码和输出总结了我遇到的问题:

$ErrorActionPreference = 'Stop'
Set-StrictMode -Version Latest

$csharp_code = @'
namespace BingleBongle
{
    public class Giblets
    {
        public delegate int DSomeFunc(ref bool Cancel);

        public static bool WutWut(
            DSomeFunc someFunc
            )
        {
            bool Cancel = false;
            int result = someFunc(ref Cancel);

            if (Cancel == false &&
                result == 69)
            {
                Cancel = true;
            }

            return Cancel;
        }
    }
}
'@

Add-Type -TypeDefinition $csharp_code

'anon function' | Out-Host

[BingleBongle.Giblets]::WutWut([BingleBongle.Giblets+DSomeFunc]{
    param ([ref] $Cancel)
    $Cancel.Value | Out-Host
    $Cancel.Value = [bool]$true
    $Cancel.Value | Out-Host
})

'variable' | Out-Host

$myDelegate = [BingleBongle.Giblets+DSomeFunc]{
    param ([ref] $Cancel)
    $Cancel.Value | Out-Host
    $Cancel.Value = [bool]$true
    $Cancel.Value | Out-Host

    69
}

[BingleBongle.Giblets]::WutWut($myDelegate)

在这两种情况下,更改 $Cancel.Value 均无效,并且不会更改 C# 类中的 Cancel。

第二次尝试通过向 C# 类返回一个值 (69) 来指示我们应该更改 Cancel 来解决问题。这是一种解决方法,但使用它意味着更改真实代码,如果可能的话,我宁愿让 pass-by-ref 工作。当然可能不支持!

这是上面的输出:

anon function
False
True
False
variable
False
True
True

希望这是有道理的:)

标签: c#powershelldelegatespass-by-reference

解决方案


推荐阅读