/// <summary> /// 注意要和SystemLib中的String的对象格式相同 /// </summary> /// <param name="value"></param> /// <returns>绝对地址</returns> public uint AddConstantString(string value) { if (!StringPool.TryGetValue(value, out HeapData data)) { // 分配byte数组 HeapData stringData = MallocCharArray(Encoding.UTF8.GetByteCount(value)); Encoding.UTF8.GetBytes(value, new Span <byte>(stringData.Data, HeapData.ArrayLengthSize + HeapData.MiscDataSize, stringData.Data.Length - HeapData.ArrayLengthSize - HeapData.MiscDataSize)); // String对象 byte[] vs = new byte[HeapData.MiscDataSize + HeapData.StringLengthSize + HeapData.StringDataSize]; // 头部信息可以不填,因为MethodArea是内存的边界,GC不会继续walk // 长度信息 BitConverter.TryWriteBytes(new Span <byte>(vs, HeapData.MiscDataSize, HeapData.StringLengthSize), value.Length); // Data信息 BitConverter.TryWriteBytes(new Span <byte>(vs, HeapData.MiscDataSize + HeapData.StringLengthSize, HeapData.StringDataSize), MemoryMap.MapToAbsolute(stringData.Offset, MemoryTag.METHOD)); // 字符串 data = Malloc(vs); StringPool.Add(value, data); } return(MemoryMap.MapToAbsolute(data.Offset, MemoryTag.METHOD)); }