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

PowerShell 6中构建Unsafe Code的实现方法咨询

好问题!在PowerShell 6及以上版本(基于.NET Core/.NET 5+)里,确实没法再用Add-Type的-CompilerParameters参数来启用unsafe代码了,但完全不需要第三方库就能解决——咱们可以直接借助.NET Core的官方命令行工具dotnet来编译包含unsafe代码的程序集,之后在PowerShell里加载使用就行。

具体实现步骤

1. 准备包含unsafe代码的C#源文件

先创建一个简单的示例源码文件,比如命名为UnsafeUtils.cs,内容如下:

using System;

public static class UnsafeOperations
{
    // 启用unsafe代码块,实现指针操作
    public unsafe static void ModifyValueViaPointer(int* valuePtr)
    {
        *valuePtr *= 3;
        Console.WriteLine($"指针修改后的值:{*valuePtr}");
    }

    public unsafe static int GetPointerAddress(int value)
    {
        fixed (int* ptr = &value)
        {
            return (int)ptr;
        }
    }
}

2. 用dotnet命令编译unsafe程序集

打开PowerShell,切换到源码文件所在目录,执行以下编译命令:

# 编译启用unsafe的程序集,输出到指定目录
dotnet build -c Release -unsafe UnsafeUtils.cs -out .\UnsafeAssemblyOutput

参数说明:

  • -unsafe:这是启用unsafe代码的关键参数,告诉编译器允许编译unsafe代码块
  • -c Release:编译生产环境版本(也可以替换为Debug用于调试)
  • -out .\UnsafeAssemblyOutput:指定编译后程序集的输出目录

注意:确保你的环境已安装.NET SDK(PowerShell 7+通常会捆绑.NET SDK,若未安装需下载对应版本的SDK)

3. 在PowerShell中加载并调用unsafe代码

编译完成后,用Add-Type加载生成的DLL,就可以调用unsafe方法了:

# 加载编译好的程序集
Add-Type -Path .\UnsafeAssemblyOutput\UnsafeUtils.dll

# 调用unsafe方法示例
$testValue = 10
# 获取变量的指针(需用fixed语法或通过IntPtr转换)
$valuePtr = [System.IntPtr]::ToIntPtr([ref]$testValue)
[UnsafeOperations]::ModifyValueViaPointer([int]$valuePtr)

# 查看原变量的变化(已经被指针修改)
Write-Host "原变量修改后的值:$testValue"

额外技巧:直接在PowerShell中临时编译使用

如果不想单独创建源码文件,也可以直接在PowerShell里生成临时源码并编译,用完就清理:

# 定义unsafe代码的源码字符串
$unsafeSource = @"
using System;

public static class TempUnsafeHelper
{
    public unsafe static int SquareValue(int* numPtr)
    {
        *numPtr = (*numPtr) * (*numPtr);
        return *numPtr;
    }
}
"@

# 创建临时源码文件
$tempCsFile = [System.IO.Path]::Combine($env:TEMP, "TempUnsafeCode.cs")
Set-Content -Path $tempCsFile -Value $unsafeSource

# 编译临时程序集
$tempOutputDir = [System.IO.Path]::Combine($env:TEMP, "TempUnsafeAssembly")
dotnet build -c Release -unsafe $tempCsFile -out $tempOutputDir

# 加载并使用
Add-Type -Path (Join-Path $tempOutputDir "TempUnsafeCode.dll")
$number = 5
$numPtr = [System.IntPtr]::ToIntPtr([ref]$number)
[TempUnsafeHelper]::SquareValue([int]$numPtr)
Write-Host "平方后的值:$number"

# 清理临时文件
Remove-Item $tempCsFile -Force
Remove-Item $tempOutputDir -Recurse -Force

内容的提问来源于stack exchange,提问作者user9171470

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:10:38