using System.Diagnostics; using XFEExtension.NetCore.DelegateExtension; using XFEExtension.NetCore.AutoImplement; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 动态内存 /// /// 自定义标识名 /// 内存地址更新方法 /// 内存地址数据类型 /// 内存修改器 [CreateImpl] public abstract class UpdatableMemoryItem(string name, Func memoryAddressUpdateFunc, Type memoryItemType, MemoryEditor memoryEditor) : MemoryItem(name, memoryItemType, memoryEditor) { private UpdatableMemoryListener? listener; /// /// 监听器 /// public UpdatableMemoryListener? Listener { get => listener; protected set { listener = value; if (listener is not null) { listener.MemoryAddressUpdated += Listener_MemoryAddressUpdated; MemoryAddress = listener.MemoryAddress; } } } /// /// 地址更新时触发 /// public event XFEEventHandler? MemoryAddressUpdated; private void Listener_MemoryAddressUpdated(UpdatableMemoryListener sender, nint e) { if (MemoryAddress != e) MemoryAddress = e; MemoryAddressUpdated?.Invoke(sender, e); } /// /// 内存地址更新方法 /// public Func MemoryAddressUpdateFunc { get; init; } = memoryAddressUpdateFunc; /// public override bool HasListener { get => Listener is not null; } /// /// 内存地址 /// public nint MemoryAddress { get; set; } = memoryAddressUpdateFunc.Invoke() ?? default; /// public override bool Read(out T result) => memoryEditor.ReadMemory(MemoryAddress, out result); /// public override async Task StopListen() { if (Listener is null) throw new InvalidOperationException($"{nameof(Listener)} 监听器为空"); IsListening = false; await Listener.StopListen(); } /// public override void AddListener(TimeSpan? frequency = null, bool startListen = false) => Listener = memoryEditor.AddUpdatableListener(Name, MemoryAddressUpdateFunc, frequency, MemoryItemType, startListen); /// public override void RemoveListener() { memoryEditor.RemoveListener(Name); Listener = null; } /// public override bool Write(T value) => memoryEditor.WriteMemory(MemoryAddress, value); /// /// 更新内存地址及当前目标进程句柄 /// /// public void UpdateMemoryAddress(nint processHandler = default) { MemoryAddress = MemoryAddressUpdateFunc?.Invoke() ?? MemoryAddress; Listener?.UpdateAddress(processHandler); } internal override async Task StartListen(nint processHandler, TimeSpan? frequency = null) { if (Listener is null) throw new InvalidOperationException($"{nameof(Listener)} 监听器为空"); IsListening = true; memoryEditor.ListenerManager.IsListening = true; await Listener.StartListen(processHandler, frequency); } }