You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将含指针操作的C#代码转换为PowerShell代码

把C# Unsafe内存拷贝代码转成PowerShell的解决方案

嘿,我懂你想把这段C#的unsafe内存拷贝代码转成PowerShell的需求!确实,PowerShell不像C#那样支持直接的unsafe指针操作,但我们有两种靠谱的方式实现完全相同的功能,而且更符合PowerShell的使用习惯:

方案1:用.NET Marshal类实现(纯.NET,安全易维护)

这个方法不需要调用原生系统API,完全基于.NET的System.Runtime.InteropServices.Marshal类来完成内存拷贝,适合大多数场景,代码也更易读:

function Copy-Memory {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [IntPtr]$Source,
        [Parameter(Mandatory=$true)]
        [int]$SourceOffset,
        [Parameter(Mandatory=$true)]
        [IntPtr]$Destination,
        [Parameter(Mandatory=$true)]
        [int]$DestinationOffset,
        [Parameter(Mandatory=$true)]
        [int]$Count
    )

    # 计算偏移后的实际源/目标指针位置
    $srcPtr = [IntPtr]::Add($Source, $SourceOffset)
    $dstPtr = [IntPtr]::Add($Destination, $DestinationOffset)

    # 创建临时字节数组中转数据
    $buffer = New-Object byte[] $Count
    # 从源指针拷贝数据到缓冲区
    [System.Runtime.InteropServices.Marshal]::Copy($srcPtr, $buffer, 0, $Count)
    # 从缓冲区拷贝数据到目标指针
    [System.Runtime.InteropServices.Marshal]::Copy($buffer, 0, $dstPtr, $Count)
}

说明

这个方法通过临时字节数组中转数据,虽然多了一步内存操作,但对于绝大多数场景来说性能足够,而且不需要处理复杂的指针逻辑,安全性也更高。


方案2:调用Windows原生API(高效底层拷贝)

如果你需要和原C#代码一样的直接内存到内存拷贝(无中转,性能拉满),可以通过PowerShell的Add-Type定义P/Invoke,调用Windows内核的RtlCopyMemory函数——这和你原C#代码的底层逻辑一致,而且是系统优化过的实现:

# 先定义包含P/Invoke调用的.NET类型
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;

public class MemoryUtils {
    [DllImport("kernel32.dll", EntryPoint = "RtlCopyMemory", SetLastError = false)]
    public static extern void CopyMemory(IntPtr Destination, IntPtr Source, uint Length);
}
"@

function Copy-Memory {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]
        [IntPtr]$Source,
        [Parameter(Mandatory=$true)]
        [int]$SourceOffset,
        [Parameter(Mandatory=$true)]
        [IntPtr]$Destination,
        [Parameter(Mandatory=$true)]
        [int]$DestinationOffset,
        [Parameter(Mandatory=$true)]
        [int]$Count
    )

    # 计算偏移后的实际指针
    $srcPtr = [IntPtr]::Add($Source, $SourceOffset)
    $dstPtr = [IntPtr]::Add($Destination, $DestinationOffset)

    # 调用原生内存拷贝函数(注意参数顺序:目标在前,源在后)
    [MemoryUtils]::CopyMemory($dstPtr, $srcPtr, [uint]$Count)
}

关键注意点

  • RtlCopyMemory的参数顺序是目标指针在前,源指针在后,和你原C#代码的顺序相反,调用时别搞混了!
  • 这个方法直接操作内存,要确保你传入的IntPtr是有效的、有足够权限访问的内存地址,避免内存访问错误。

为什么PowerShell不能直接用指针?
PowerShell默认运行在.NET的安全上下文里,不支持unsafe代码块和直接的指针操作,所以必须通过上述间接方式来实现内存拷贝逻辑。

内容的提问来源于stack exchange,提问作者Antonio J. Pizarro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:54:51