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

为何无法在C#的fixed语句中使用extern外部函数?

问题分析与解决

错误原因

C# 的fixed语句有明确语法限制:它的右侧表达式必须是托管数组、字符串,或是指向值类型变量的指针变量,不能直接使用函数调用的返回值。这是因为fixed的核心作用是绑定托管对象,防止GC在代码块执行期间移动其内存;而函数调用的返回值是临时指针,编译器无法验证它是否指向可固定的托管内存,也无法完成内存固定的逻辑绑定,因此报错。

解决方案

根据fillArray函数的实际类型(托管/非托管),有两种处理方式:

1. 如果fillArray是托管函数(返回传入数组的指针)

直接对原托管数组使用fixed,再操作固定后的指针即可:

char[] array = new char[42];
unsafe
{
    fixed (char* p = array)
    {
        // 若fillArray需要接收指针参数,直接传入p
        char* result = FunctionsHolder.fillArray(p);
        // 这里编写操作指针的代码
    }
}

2. 如果fillArray是非托管库函数(返回非托管内存指针)

非托管内存不会被GC移动,完全不需要使用fixed语句,直接使用返回的指针即可,注意用完后要释放非托管内存(如果函数要求的话):

char[] array = new char[42];
unsafe
{
    char* p = FunctionsHolder.fillArray(array);
    // 编写操作非托管内存指针的代码
    // 若需要释放内存,调用对应非托管释放函数,比如:Free(p);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:05:08