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);
}
}