为何无法在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
相关产品推荐
相关产品推荐

