c# - 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
希望这是有道理的:)
解决方案
推荐阅读
- mysql - 计算两个日期之间的特定日期计数
- reactjs - 如何检查 React 是否更新 dom?
- angular - Angular - 声明嵌套的接口对象数组
- php - 如何在 PHP 中将多个数字循环在一起?
- jakarta-ee - 将 kotlin-compiler-embeddable 嵌入 Java EE App 会导致 CDI 相关的部署错误
- python - 循环未正确对值求和
- excel - 从 Excel 获取图表/图形到 Matlab 报告生成器
- python - Python - 比较两个列表时出现循环问题
- swift - MobileVLCKit 在项目中占用了大量空间
- python - 添加多列