using System.Collections; using System.Diagnostics; using XFEExtension.NetCore.DelegateExtension; namespace XFEExtension.NetCore.MemoryEditor.Manager; /// /// 内存地址管理器 /// public abstract class MemoryManager : IMemoryManager { private protected bool disposedValue; private protected XFEEventHandler? valueChanged; /// /// 当指定地址的内存值变化时触发 /// public event XFEEventHandler? ValueChanged { add => valueChanged += value; remove => valueChanged -= value; } /// /// 当前进程结束时触发 /// public event EventHandler? CurrentProcessExit; /// /// 目标进程启动时触发 /// public event EventHandler? CurrentProcessEntered; /// /// 当前目标进程 /// public Process? CurrentProcess { get => Editor.CurrentProcess; set => Editor.CurrentProcess = value; } /// /// 进程句柄 /// public nint ProcessHandler { get => Editor.ProcessHandler; set => Editor.ProcessHandler = value; } /// /// 目标进程名称 /// public string ProcessName { get => Editor.ProcessName; set => Editor.ProcessName = value; } /// /// 当目标进程退出后,是否自动重新获取进程 /// public bool AutoReacquireProcess { get => Editor.AutoReacquireProcess; set => Editor.AutoReacquireProcess = value; } /// /// 重新获取进程的检测频率(单位毫秒) /// public int ReacquireProcessFrequency { get => Editor.AutoReacquireProcessFrequency; set => Editor.AutoReacquireProcessFrequency = value; } /// /// 进程句柄权限(不懂勿填) /// public ProcessAccessFlags ProcessAccessFlags { get => Editor.ProcessAccessFlags; set => Editor.ProcessAccessFlags = value; } /// /// 进程位数类型(32/64) /// public ProcessType ProcessBiteType { get => Editor.ProcessBiteType; set => Editor.ProcessBiteType = value; } /// /// 编辑器 /// public MemoryEditor Editor { get; protected set; } = new(); /// /// 等待目标进程出现 /// /// 进程名称 /// 检测频率 /// public async Task WaitProcessEnter(string? processName = null, int frequency = 500) => await Editor.WaitProcessEnter(processName, frequency); /// /// 移除指定名称的地址 /// /// 地址名称 public abstract void Remove(string addressName); internal abstract void Add(MemoryItemBuilder builder); /// /// 添加地址 /// /// 内存地址构建器组 public void Add(params MemoryItemBuilder[] builders) { foreach (var builder in builders) Add(builder); } /// /// 释放资源 /// /// private protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { Editor.Dispose(); } disposedValue = true; } } /// /// 释放资源 /// public void Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } /// /// 获取枚举器 /// /// public abstract IEnumerator GetEnumerator(); /// /// 内存管理器 /// protected MemoryManager() { Editor.CurrentProcessEntered += (sender, e) => CurrentProcessEntered?.Invoke(sender, e); Editor.CurrentProcessExit += (sender, e) => CurrentProcessExit?.Invoke(sender, e); } /// /// 创建内存管理器构建器 /// /// public static MemoryManagerBuilder CreateBuilder() => MemoryManagerBuilder.CreateBuilder(); }