using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace GeoSigmaDrawLib { /// /// 表示一个按指定编码转换后的非托管内存文本缓冲区。 /// 支持自动释放,避免内存泄漏。 /// public class NativeTextBuffer : IDisposable { private const string GB2312 = "GB2312"; /// /// 编码类型枚举,便于调用方选择 /// public enum EncodingType { GBK, UTF8, UTF16, } /// /// 非托管内存指针 /// public IntPtr Pointer { get; private set; } /// /// 缓冲区字节长度 /// public int Length { get; private set; } /// /// 构造函数:根据指定编码将字符串转换为非托管内存缓冲区 /// /// 源文本 /// 目标编码 public NativeTextBuffer(string text, EncodingType encoding = EncodingType.GBK) { if (text == null) { throw new ArgumentNullException(nameof(text)); } Encoding enc = Encoding.GetEncoding(GB2312); switch (encoding) { case EncodingType.GBK: enc = Encoding.GetEncoding(GB2312); break; case EncodingType.UTF8: enc = Encoding.UTF8; break; case EncodingType.UTF16: enc = Encoding.Unicode; break; } byte[] bytes = enc.GetBytes(text); Pointer = Marshal.AllocHGlobal(bytes.Length); Marshal.Copy(bytes, 0, Pointer, bytes.Length); Length = bytes.Length; } /// /// 释放非托管内存 /// public void Dispose() { if (Pointer != IntPtr.Zero) { Marshal.FreeHGlobal(Pointer); Pointer = IntPtr.Zero; } } } }