返回提交历史
Modified
XFEExtension.NetCore.MemoryEditor/Manager/DynamicMemoryManager.cs
+9
-9
Modified
XFEExtension.NetCore.MemoryEditor/Manager/MemoryItemBuilder.cs
+25
-61
Modified
XFEExtension.NetCore.MemoryEditor/Manager/MemoryManagerBuilder.cs
+21
-33
Modified
XFEExtension.NetCore.MemoryEditor/Manager/StaticMemoryManager.cs
+5
-5
Modified
XFEExtension.NetCore.MemoryEditor/Manager/UpdatableMemoryManager.cs
+9
-9
Modified
XFEExtension.NetCore.MemoryEditor/XFEExtension.NetCore.MemoryEditor.csproj
+3
-2
XFEstudio/XFEExtension.NetCore.MemoryEditor
fix-修复部分API文档说明错误 change-现在,内存地址构建器和内存管理器构建器只能通过方法更改内部属性值
a8a2555
代码差异
6 个文件
+72
-119
@@ -21,24 +21,24 @@ public abstract class DynamicMemoryManager : MemoryManager
21
21
public DynamicMemoryItem this[string addressName] => ItemDictionary[addressName];
22
22
internal override void Add(MemoryItemBuilder builder)
23
23
{
24
if (builder.UseResolvePointer)
24
if (builder.useResolvePointer)
25
25
{
26
if (builder.ModuleName is null)
26
if (builder.moduleName is null)
27
27
throw new ArgumentNullException(nameof(builder), "对于使用基址指针表达式的构建器,模块名称是必须的");
28
builder.DynamicMemoryAddress = new(() =>
28
builder.dynamicMemoryAddress = new(() =>
29
29
{
30
try { return Editor.ResolvePointerAddress(builder.ModuleName, builder.BaseAddress, builder.Offsets); } catch { return null; }
30
try { return Editor.ResolvePointerAddress(builder.moduleName, builder.baseAddress, builder.offsets); } catch { return null; }
31
31
});
32
32
}
33
33
else
34
34
{
35
if (builder.DynamicMemoryAddress is null)
35
if (builder.dynamicMemoryAddress is null)
36
36
throw new ArgumentNullException(nameof(builder), "对于动态地址管理器,构建器的动态地址不可为空");
37
37
}
38
var dynamicMemoryItem = new DynamicMemoryItemImpl(builder.Name, builder.DynamicMemoryAddress, builder.MemoryAddressType, Editor);
39
if (builder.HasListener)
40
dynamicMemoryItem.AddListener(builder.ListenerFrequency, builder.StartListen);
41
ItemDictionary.Add(builder.Name, dynamicMemoryItem);
38
var dynamicMemoryItem = new DynamicMemoryItemImpl(builder.name, builder.dynamicMemoryAddress, builder.memoryAddressType, Editor);
39
if (builder.hasListener)
40
dynamicMemoryItem.AddListener(builder.ListenerFrequency, builder.startListen);
41
ItemDictionary.Add(builder.name, dynamicMemoryItem);
42
42
}
43
43
/// <summary>
44
44
/// 获取枚举器
@@ -8,54 +8,18 @@ namespace XFEExtension.NetCore.MemoryEditor.Manager;
8
8
[CreateImpl]
9
9
public abstract class MemoryItemBuilder
10
10
{
11
/// <summary>
12
/// 内存地址标识名
13
/// </summary>
14
public required string Name { get; set; }
15
/// <summary>
16
/// 是否添加监听器
17
/// </summary>
18
public bool HasListener { get; set; }
19
/// <summary>
20
/// 是否立即开始监听(监听器会自动创建但是默认不会立即开始监听)
21
/// </summary>
22
public bool StartListen { get; set; }
23
/// <summary>
24
/// 使用基址指针表达式
25
/// </summary>
26
public bool UseResolvePointer { get; private set; }
27
/// <summary>
28
/// 内存地址类型
29
/// </summary>
30
public required Type MemoryAddressType { get; set; }
31
/// <summary>
32
/// 监听器监听频率
33
/// </summary>
34
public TimeSpan ListenerFrequency { get; set; }
35
/// <summary>
36
/// 内存地址
37
/// </summary>
38
public nint? StaticMemoryAddress { get; set; }
39
/// <summary>
40
/// 内存地址动态获取方法
41
/// </summary>
42
public Func<nint?>? DynamicMemoryAddress { get; set; }
43
/// <summary>
44
/// 可更新内存地址更新方法
45
/// </summary>
46
public Func<nint?>? UpdatableMemoryAddress { get; set; }
47
/// <summary>
48
/// 模块名称
49
/// </summary>
50
public string? ModuleName { get; set; }
51
/// <summary>
52
/// 模块的地址部分
53
/// </summary>
54
public nint BaseAddress { get; set; }
55
/// <summary>
56
/// 基址偏移部分
57
/// </summary>
58
public nint[] Offsets { get; set; } = [];
11
internal string name = string.Empty;
12
internal bool hasListener;
13
internal bool startListen;
14
internal bool useResolvePointer;
15
internal Type memoryAddressType = typeof(int);
16
internal TimeSpan listenerFrequency;
17
internal nint? staticMemoryAddress;
18
internal Func<nint?>? dynamicMemoryAddress;
19
internal Func<nint?>? updatableMemoryAddress;
20
internal string? moduleName;
21
internal nint baseAddress;
22
internal nint[] offsets = [];
59
23
/// <summary>
60
24
/// 为该地址添加监听器
61
25
/// </summary>
@@ -64,9 +28,9 @@ public abstract class MemoryItemBuilder
64
28
/// <returns></returns>
65
29
public MemoryItemBuilder WithListener(TimeSpan frequency, bool startListen = false)
66
30
{
67
HasListener = true;
31
hasListener = true;
68
32
ListenerFrequency = frequency;
69
StartListen = startListen;
33
this.startListen = startListen;
70
34
return this;
71
35
}
72
36
/// <summary>
@@ -77,9 +41,9 @@ public abstract class MemoryItemBuilder
77
41
/// <returns></returns>
78
42
public MemoryItemBuilder WithListener(int frequency = 1, bool startListen = false)
79
43
{
80
HasListener = true;
44
hasListener = true;
81
45
ListenerFrequency = TimeSpan.FromMilliseconds(frequency);
82
StartListen = startListen;
46
this.startListen = startListen;
83
47
return this;
84
48
}
85
49
/// <summary>
@@ -89,7 +53,7 @@ public abstract class MemoryItemBuilder
89
53
/// <returns></returns>
90
54
public MemoryItemBuilder WithStaticMemoryAddress(nint memoryAddress)
91
55
{
92
StaticMemoryAddress = memoryAddress;
56
staticMemoryAddress = memoryAddress;
93
57
return this;
94
58
}
95
59
/// <summary>
@@ -99,7 +63,7 @@ public abstract class MemoryItemBuilder
99
63
/// <returns></returns>
100
64
public MemoryItemBuilder WithDynamicMemoryAddress(Func<nint?> memoryAddressGetFunc)
101
65
{
102
DynamicMemoryAddress = memoryAddressGetFunc;
66
dynamicMemoryAddress = memoryAddressGetFunc;
103
67
return this;
104
68
}
105
69
/// <summary>
@@ -111,10 +75,10 @@ public abstract class MemoryItemBuilder
111
75
/// <returns></returns>
112
76
public MemoryItemBuilder WithResolvePointer(string moduleName, nint baseAddress, params nint[] offsets)
113
77
{
114
UseResolvePointer = true;
115
ModuleName = moduleName;
116
BaseAddress = baseAddress;
117
Offsets = offsets;
78
useResolvePointer = true;
79
this.moduleName = moduleName;
80
this.baseAddress = baseAddress;
81
this.offsets = offsets;
118
82
return this;
119
83
}
120
84
/// <summary>
@@ -124,14 +88,14 @@ public abstract class MemoryItemBuilder
124
88
/// <returns></returns>
125
89
public MemoryItemBuilder WithUpdatableMemoryAddress(Func<nint?> memoryAddressUpdateFunc)
126
90
{
127
UpdatableMemoryAddress = memoryAddressUpdateFunc;
91
updatableMemoryAddress = memoryAddressUpdateFunc;
128
92
return this;
129
93
}
130
94
/// <summary>
131
/// 构建静态地址
95
/// 构建内存地址
132
96
/// </summary>
133
97
/// <typeparam name="T">内存地址的数据类型</typeparam>
134
98
/// <param name="name">内存地址自定义标识名</param>
135
99
/// <returns></returns>
136
public static MemoryItemBuilder Create<T>(string name) => new MemoryItemBuilderImpl { Name = name, MemoryAddressType = typeof(T) };
100
public static MemoryItemBuilder Create<T>(string name) => new MemoryItemBuilderImpl { name = name, memoryAddressType = typeof(T) };
137
101
}
@@ -8,22 +8,10 @@ namespace XFEExtension.NetCore.MemoryEditor.Manager;
8
8
[CreateImpl]
9
9
public abstract class MemoryManagerBuilder()
10
10
{
11
/// <summary>
12
/// 进程名称
13
/// </summary>
14
public string ProcessName { get; set; } = string.Empty;
15
/// <summary>
16
/// 当目标进程退出后,是否自动重新获取进程
17
/// </summary>
18
public bool AutoReacquireProcess { get; set; }
19
/// <summary>
20
/// 重新获取进程的检测频率(单位毫秒)
21
/// </summary>
22
public int ReacquireProcessFrequency { get; set; }
23
/// <summary>
24
/// 是否在创建后自动开始寻找目标进程
25
/// </summary>
26
public bool FindProcessWhenCreate { get; set; }
11
internal string processName = string.Empty;
12
internal bool autoReacquireProcess;
13
internal int reacquireProcessFrequency;
14
internal bool findProcessWhenCreate;
27
15
/// <summary>
28
16
/// 创建内存地址管理器构建器
29
17
/// </summary>
@@ -38,9 +26,9 @@ public abstract class MemoryManagerBuilder()
38
26
public MemoryManagerBuilder WithAutoReacquireProcess(string processName = "", int reacquireProcessFrequency = 500)
39
27
{
40
28
if (processName != string.Empty)
41
ProcessName = processName;
42
AutoReacquireProcess = true;
43
ReacquireProcessFrequency = reacquireProcessFrequency;
29
this.processName = processName;
30
autoReacquireProcess = true;
31
this.reacquireProcessFrequency = reacquireProcessFrequency;
44
32
return this;
45
33
}
46
34
/// <summary>
@@ -51,8 +39,8 @@ public abstract class MemoryManagerBuilder()
51
39
public MemoryManagerBuilder WithFindProcessWhenCreate(string processName = "")
52
40
{
53
41
if (processName != string.Empty)
54
ProcessName = processName;
55
FindProcessWhenCreate = true;
42
this.processName = processName;
43
findProcessWhenCreate = true;
56
44
return this;
57
45
}
58
46
/// <summary>
@@ -64,11 +52,11 @@ public abstract class MemoryManagerBuilder()
64
52
{
65
53
var manager = new StaticMemoryManagerImpl(builders)
66
54
{
67
AutoReacquireProcess = AutoReacquireProcess,
68
ReacquireProcessFrequency = ReacquireProcessFrequency,
69
ProcessName = ProcessName
55
AutoReacquireProcess = autoReacquireProcess,
56
ReacquireProcessFrequency = reacquireProcessFrequency,
57
ProcessName = processName
70
58
};
71
if (FindProcessWhenCreate)
59
if (findProcessWhenCreate)
72
60
_ = manager.WaitProcessEnter(manager.ProcessName);
73
61
return manager;
74
62
}
@@ -81,11 +69,11 @@ public abstract class MemoryManagerBuilder()
81
69
{
82
70
var manager = new DynamicMemoryManagerImpl(builders)
83
71
{
84
AutoReacquireProcess = AutoReacquireProcess,
85
ReacquireProcessFrequency = ReacquireProcessFrequency,
86
ProcessName = ProcessName
72
AutoReacquireProcess = autoReacquireProcess,
73
ReacquireProcessFrequency = reacquireProcessFrequency,
74
ProcessName = processName
87
75
};
88
if (FindProcessWhenCreate)
76
if (findProcessWhenCreate)
89
77
_ = manager.WaitProcessEnter(manager.ProcessName);
90
78
return manager;
91
79
}
@@ -98,11 +86,11 @@ public abstract class MemoryManagerBuilder()
98
86
{
99
87
var manager = new UpdatableMemoryManager(builders)
100
88
{
101
AutoReacquireProcess = AutoReacquireProcess,
102
ReacquireProcessFrequency = ReacquireProcessFrequency,
103
ProcessName = ProcessName
89
AutoReacquireProcess = autoReacquireProcess,
90
ReacquireProcessFrequency = reacquireProcessFrequency,
91
ProcessName = processName
104
92
};
105
if (FindProcessWhenCreate)
93
if (findProcessWhenCreate)
106
94
_ = manager.WaitProcessEnter(manager.ProcessName);
107
95
return manager;
108
96
}
@@ -21,12 +21,12 @@ public class StaticMemoryManager : MemoryManager
21
21
public StaticMemoryItem this[string addressName] => ItemDictionary[addressName];
22
22
internal override void Add(MemoryItemBuilder builder)
23
23
{
24
if (builder.StaticMemoryAddress is null)
24
if (builder.staticMemoryAddress is null)
25
25
throw new ArgumentNullException(nameof(builder), "对于静态地址管理器,构建器的静态地址不可为空");
26
var staticMemoryItem = new StaticMemoryItemImpl(builder.Name, builder.StaticMemoryAddress.Value, builder.MemoryAddressType, Editor);
27
if (builder.HasListener)
28
staticMemoryItem.AddListener(builder.ListenerFrequency, builder.StartListen);
29
ItemDictionary.Add(builder.Name, staticMemoryItem);
26
var staticMemoryItem = new StaticMemoryItemImpl(builder.name, builder.staticMemoryAddress.Value, builder.memoryAddressType, Editor);
27
if (builder.hasListener)
28
staticMemoryItem.AddListener(builder.ListenerFrequency, builder.startListen);
29
ItemDictionary.Add(builder.name, staticMemoryItem);
30
30
}
31
31
/// <summary>
32
32
/// 获取枚举器
@@ -21,24 +21,24 @@ public class UpdatableMemoryManager : MemoryManager
21
21
public UpdatableMemoryItem this[string addressName] => ItemDictionary[addressName];
22
22
internal override void Add(MemoryItemBuilder builder)
23
23
{
24
if (builder.UseResolvePointer)
24
if (builder.useResolvePointer)
25
25
{
26
if (builder.ModuleName is null)
26
if (builder.moduleName is null)
27
27
throw new ArgumentNullException(nameof(builder), "对于使用基址指针表达式的构建器,模块名称是必须的");
28
builder.UpdatableMemoryAddress = new(() =>
28
builder.updatableMemoryAddress = new(() =>
29
29
{
30
try { return Editor.ResolvePointerAddress(builder.ModuleName, builder.BaseAddress, builder.Offsets); } catch { return null; }
30
try { return Editor.ResolvePointerAddress(builder.moduleName, builder.baseAddress, builder.offsets); } catch { return null; }
31
31
});
32
32
}
33
33
else
34
34
{
35
if (builder.UpdatableMemoryAddress is null)
35
if (builder.updatableMemoryAddress is null)
36
36
throw new ArgumentNullException(nameof(builder), "对于可更新内存管理器,构建器更新地址的方法不可为空");
37
37
}
38
var updatableMemoryItem = new UpdatableMemoryItemImpl(builder.Name, builder.UpdatableMemoryAddress, builder.MemoryAddressType, Editor);
39
if (builder.HasListener)
40
updatableMemoryItem.AddListener(builder.ListenerFrequency, builder.StartListen);
41
ItemDictionary.Add(builder.Name, updatableMemoryItem);
38
var updatableMemoryItem = new UpdatableMemoryItemImpl(builder.name, builder.updatableMemoryAddress, builder.memoryAddressType, Editor);
39
if (builder.hasListener)
40
updatableMemoryItem.AddListener(builder.ListenerFrequency, builder.startListen);
41
ItemDictionary.Add(builder.name, updatableMemoryItem);
42
42
}
43
43
/// <summary>
44
44
/// 获取枚举器
@@ -13,13 +13,14 @@
13
13
<PackageReadmeFile>README.md</PackageReadmeFile>
14
14
<RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</RepositoryUrl>
15
15
<PackageTags>XFE;XFEExtension;MemoryEdit;Memory</PackageTags>
16
<PackageReleaseNotes>fix-修复在某些情况下无法监听的bug</PackageReleaseNotes>
16
<PackageReleaseNotes>fix-修复部分API文档说明错误
17
change-现在,内存地址构建器和内存管理器构建器只能通过方法更改内部属性值</PackageReleaseNotes>
17
18
<Copyright>寰宇朽力网络科技版权所有</Copyright>
18
19
<PackageProjectUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</PackageProjectUrl>
19
20
<GenerateDocumentationFile>True</GenerateDocumentationFile>
20
21
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
21
22
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
22
<Version>2.0.3</Version>
23
<Version>2.0.4</Version>
23
24
</PropertyGroup>
24
25
25
26
<ItemGroup>