.NET 8 RC1使用UnsafeAccessorAttribute触发CLR内部错误求助
解决.NET 8 UnsafeAccessorAttribute 访问私有字段时的CLR内部错误
问题出在UnsafeAccessor的方法签名不符合规范,导致CLR内部报错。当使用UnsafeAccessorKind.Field访问实例私有字段时,静态extern方法的返回类型必须是ref 字段类型,而非直接返回字段的值类型——该属性需要返回对私有字段的引用,而非字段值的拷贝。
修正后的代码
using System; using System.Runtime.CompilerServices; var t = new Test(); ref int sizeRef = ref Caller.GetSize(t); Console.WriteLine(sizeRef); public class Caller { [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "_size")] public static extern ref int GetSize(Test c); } public class Test { private int _size = 4; }
关键修改点
- 将
GetSize方法的返回类型从int改为ref int,明确返回对私有字段_size的引用 - 调用时通过
ref关键字获取该引用,再读取字段值
运行修正后的代码,控制台将正常输出4。
内容的提问来源于stack exchange,提问作者Илья Белов
相关产品推荐
相关产品推荐

