XFEstudio/MyFirstRespo
改为nuget包途径
c5153b2
代码差异
9 个文件
+4
-717
@@ -1,148 +0,0 @@
1
using System.Diagnostics;
2
using XFEExtension.NetCore.XFETransform.ObjectInfoAnalyzer;
3
using XFEExtension.NetCore.XFETransform;
4
using XFEExtension.NetCore.XFETransform.StringConverter;
5
6
namespace XFEExtension.NetCore.XFEConsole;
7
8
/// <summary>
9
/// XFE控制台
10
/// </summary>
11
public class XFEConsole
12
{
13
/// <summary>
14
/// 是否在本地调试的Debug中展示
15
/// </summary>
16
/// <remarks>
17
/// 默认为 true
18
/// </remarks>
19
public static bool ShowInDebug { get; set; } = true;
20
/// <summary>
21
/// 是否在本地控制台中显示
22
/// </summary>
23
/// <remarks>
24
/// 默认为 false
25
/// </remarks>
26
public static bool ShowInLocalConsole { get; set; } = false;
27
/// <summary>
28
/// 是否自动解析对象,而非直接输出对象的.ToString()方法
29
/// </summary>
30
/// <remarks>
31
/// 默认为 true
32
/// </remarks>
33
public static bool AutoAnalyzeObject { get; set; } = true;
34
/// <summary>
35
/// 客户端列表
36
/// </summary>
37
public static List<XFEConsoleProgramClient> ClientList { get; set; } = [];
38
/// <summary>
39
/// 使用XFE控制台
40
/// </summary>
41
/// <param name="ipAddress">IP地址</param>
42
/// <param name="name">客户端名称</param>
43
/// <param name="id">客户端ID</param>
44
/// <param name="password">密码</param>
45
/// <returns>是否连接成功</returns>
46
public static async Task<bool> UseXFEConsole(string ipAddress, string name, string id, string password)
47
{
48
SetConsoleOutput();
49
return await ConnectConsole(ipAddress, name, id, password);
50
}
51
/// <summary>
52
/// 使用XFE控制台
53
/// </summary>
54
/// <param name="port">端口</param>
55
/// <param name="password">密码</param>
56
/// <returns>是否连接成功</returns>
57
public static async Task<bool> UseXFEConsole(string port, string password = "") => await UseXFEConsole($"ws://*:{port}", AppDomain.CurrentDomain.FriendlyName, Guid.NewGuid().ToString(), password);
58
/// <summary>
59
/// 设置XFE控制台
60
/// </summary>
61
/// <returns></returns>
62
public static void SetConsoleOutput()
63
{
64
Console.SetOut(new XFEConsoleTextWriter());
65
}
66
/// <summary>
67
/// 连接XFE控制台
68
/// </summary>
69
/// <param name="ipAddress">IP地址</param>
70
/// <param name="name">客户端名称</param>
71
/// <param name="id">客户端ID</param>
72
/// <param name="password">密码</param>
73
/// <returns>是否连接成功</returns>
74
public static async Task<bool> ConnectConsole(string ipAddress, string name, string id, string password)
75
{
76
var client = new XFEConsoleProgramClient(ipAddress, name, id, password);
77
if (await client.Connect())
78
{
79
ClientList.Add(client);
80
return true;
81
}
82
else
83
{
84
return false;
85
}
86
}
87
/// <summary>
88
/// 输出对象信息
89
/// </summary>
90
/// <param name="obj">对象</param>
91
/// <param name="remarkName">对象注释</param>
92
/// <param name="onlyProperty">仅解析属性</param>
93
/// <param name="onlyPublic">仅解析公共属性或字段</param>
94
/// <returns></returns>
95
public static async Task WriteObject(object? obj, string remarkName = "分析对象", bool onlyProperty = true, bool onlyPublic = true)
96
{
97
var objectInfo = "无法分析对象:";
98
try
99
{
100
objectInfo = XFEConverter.GetObjectInfo(StringConverter.ObjectAnalyzer, remarkName, ObjectPlace.Main, 0, obj?.GetType(), obj, onlyProperty, onlyPublic).OutPutObject();
101
}
102
catch (Exception ex)
103
{
104
Debug.WriteLine(ex);
105
objectInfo += ex.StackTrace;
106
}
107
if (ShowInDebug)
108
Debug.WriteLine(objectInfo);
109
if (ShowInLocalConsole)
110
Console.WriteLine(objectInfo);
111
foreach (var client in ClientList)
112
await client.OutputMessage(objectInfo, true);
113
}
114
/// <summary>
115
/// 向已连接的XFE控制台输出一条消息
116
/// </summary>
117
/// <param name="text">文本</param>
118
/// <returns></returns>
119
public static async Task WriteLine(string? text)
120
{
121
if (text is not null)
122
{
123
if (ShowInDebug)
124
Debug.WriteLine(text);
125
if (ShowInLocalConsole)
126
Console.WriteLine(text);
127
foreach (var client in ClientList)
128
await client.OutputMessage(text, true);
129
}
130
}
131
/// <summary>
132
/// 向已连接的XFE控制台输出一条消息
133
/// </summary>
134
/// <param name="text">文本</param>
135
/// <returns></returns>
136
public static async Task Write(string? text)
137
{
138
if (text is not null)
139
{
140
if (ShowInDebug)
141
Debug.WriteLine(text);
142
if (ShowInLocalConsole)
143
Console.WriteLine(text);
144
foreach (var client in ClientList)
145
await client.OutputMessage(text, false);
146
}
147
}
148
}
@@ -1,30 +0,0 @@
1
using XFEExtension.NetCore.CyberComm;
2
3
namespace XFEExtension.NetCore.XFEConsole;
4
5
/// <summary>
6
/// XFE控制台客户端信息
7
/// </summary>
8
/// <param name="clientName">客户端名称</param>
9
/// <param name="clientUUID">客户端唯一标识符</param>
10
/// <param name="password">客户端连接时密码</param>
11
/// <param name="eventArgs">事件参数</param>
12
public class XFEConsoleClientInfo(string clientName, string clientUUID, string password, CyberCommServerEventArgs eventArgs)
13
{
14
/// <summary>
15
/// 客户端名称
16
/// </summary>
17
public string ClientName { get; set; } = clientName;
18
/// <summary>
19
/// 客户端唯一标识符
20
/// </summary>
21
public string ClientUUID { get; set; } = clientUUID;
22
/// <summary>
23
/// 客户端密码
24
/// </summary>
25
public string Password { get; set; } = password;
26
/// <summary>
27
/// 事件参数
28
/// </summary>
29
public CyberCommServerEventArgs EventArgs { get; set; } = eventArgs;
30
}
@@ -1,66 +0,0 @@
1
using XFEExtension.NetCore.CyberComm;
2
using XFEExtension.NetCore.FormatExtension;
3
using XFEExtension.NetCore.TaskExtension;
4
5
namespace XFEExtension.NetCore.XFEConsole;
6
7
/// <summary>
8
/// XFE控制台程序客户端
9
/// </summary>
10
/// <remarks>
11
/// 默认构造函数
12
/// </remarks>
13
/// <param name="ipAddress">控制台输出端IP地址</param>
14
/// <param name="clientName">客户端名称</param>
15
/// <param name="password">密码</param>
16
/// <param name="clientID">客户端ID</param>
17
public class XFEConsoleProgramClient(string ipAddress, string clientName, string password, string clientID)
18
{
19
private event EndTaskTrigger<bool>? ConnectTrigger;
20
/// <summary>
21
/// 客户端
22
/// </summary>
23
public CyberCommClient Client { get; set; } = new CyberCommClient(ipAddress);
24
/// <summary>
25
/// 客户端名称
26
/// </summary>
27
public string ClientName { get; set; } = clientName;
28
/// <summary>
29
/// 连接时密码
30
/// </summary>
31
public string Password { get; set; } = password;
32
/// <summary>
33
/// 客户端ID
34
/// </summary>
35
public string ClientID { get; set; } = clientID;
36
/// <summary>
37
/// 连接服务器
38
/// </summary>
39
/// <returns></returns>
40
public async Task<bool> Connect()
41
{
42
Client.Connected += Client_Connected;
43
_ = Client.StartCyberCommClient();
44
Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientName), ClientName);
45
Client.ClientWebSocket!.Options.SetRequestHeader(nameof(Password), Password);
46
Client.ClientWebSocket!.Options.SetRequestHeader(nameof(ClientID), ClientID);
47
if (Client.IsConnected)
48
return true;
49
else
50
return await new XFEWaitTask<bool>(ref ConnectTrigger!);
51
}
52
53
private void Client_Connected(object? sender, EventArgs e) => ConnectTrigger?.Invoke(true);
54
55
/// <summary>
56
/// 输出控制台消息
57
/// </summary>
58
/// <param name="message">消息文本</param>
59
/// <param name="isLine">是否是一整行</param>
60
/// <returns></returns>
61
public async Task OutputMessage(string message, bool isLine)
62
{
63
if (Client.IsConnected)
64
await Client.SendTextMessage(new XFEDictionary("IsLine", isLine ? "true" : "false", "Text", message));
65
}
66
}
@@ -1,8 +0,0 @@
1
namespace XFEExtension.NetCore.XFEConsole;
2
3
/// <summary>
4
/// XFE控制台进程服务器
5
/// </summary>
6
public class XFEConsoleProgramServer
7
{
8
}
@@ -1,8 +0,0 @@
1
namespace XFEExtension.NetCore.XFEConsole;
2
3
/// <summary>
4
/// XFE控制台终端客户端
5
/// </summary>
6
public class XFEConsoleTerminalClient
7
{
8
}
@@ -1,150 +0,0 @@
1
using System.Net.WebSockets;
2
using XFEExtension.NetCore.CyberComm;
3
using XFEExtension.NetCore.DelegateExtension;
4
using XFEToolBox.Views.Pages;
5
6
namespace XFEExtension.NetCore.XFEConsole;
7
8
/// <summary>
9
/// XFE控制台终端服务器
10
/// </summary>
11
public class XFEConsoleTerminalServer
12
{
13
/// <summary>
14
/// 服务器
15
/// </summary>
16
public CyberCommServer Server { get; set; }
17
/// <summary>
18
/// 密码
19
/// </summary>
20
public string Password { get; set; }
21
/// <summary>
22
/// Socket客户端-客户端信息字典
23
/// </summary>
24
public Dictionary<WebSocket, XFEConsoleClientInfo> ClientInfoDictionary { get; set; } = [];
25
/// <summary>
26
/// 客户端连接事件
27
/// </summary>
28
public event XFEEventHandler<XFEConsoleTerminalServer, XFEConsoleClientInfo>? Connected;
29
/// <summary>
30
/// 客户端断开连接事件
31
/// </summary>
32
public event XFEEventHandler<XFEConsoleTerminalServer, XFEConsoleClientInfo>? Disconnected;
33
/// <summary>
34
/// 接收到客户端消息触发
35
/// </summary>
36
public event XFEEventHandler<XFEConsoleClientInfo, string>? MessageReceived;
37
/// <summary>
38
/// 发生错误
39
/// </summary>
40
public event XFEEventHandler<XFEConsoleClientInfo, Exception>? ErrorOccurred;
41
/// <summary>
42
/// 服务器启动事件
43
/// </summary>
44
public event XFEEventHandler<XFEConsoleTerminalServer>? ServerStarted;
45
/// <summary>
46
/// XFE控制台终端服务器
47
/// </summary>
48
/// <param name="port">端口号</param>
49
/// <param name="localOnly">是否只在本地开启</param>
50
/// <param name="password">密码(默认为空)</param>
51
public XFEConsoleTerminalServer(int port, bool localOnly = true, string password = "")
52
{
53
Password = password;
54
if (localOnly)
55
Server = new CyberCommServer($"http://localhost:{port}/");
56
else
57
Server = new CyberCommServer(port);
58
Server.ServerStarted += Server_ServerStarted;
59
Server.ClientConnected += Server_ClientConnected;
60
Server.ConnectionClosed += Server_ConnectionClosed;
61
Server.MessageReceived += Server_MessageReceived;
62
}
63
/// <summary>
64
/// XFE控制台终端服务器
65
/// </summary>
66
/// <param name="ipAddress">IP地址</param>
67
/// <param name="password">密码(默认为空)</param>
68
public XFEConsoleTerminalServer(string[] ipAddress, string password = "")
69
{
70
Password = password;
71
Server = new CyberCommServer(ipAddress);
72
Server.ServerStarted += Server_ServerStarted;
73
Server.ClientConnected += Server_ClientConnected;
74
Server.ConnectionClosed += Server_ConnectionClosed;
75
Server.MessageReceived += Server_MessageReceived;
76
}
77
78
private void Server_MessageReceived(object? sender, CyberCommServerEventArgs e)
79
{
80
switch (e.MessageType)
81
{
82
case BackMessageType.Text:
83
MessageReceived?.Invoke(ClientInfoDictionary[e.CurrentWebSocket], e.TextMessage!);
84
break;
85
case BackMessageType.Binary:
86
break;
87
case BackMessageType.Error:
88
ErrorOccurred?.Invoke(ClientInfoDictionary[e.CurrentWebSocket], e.Exception!);
89
break;
90
default:
91
break;
92
}
93
}
94
95
private void Server_ConnectionClosed(object? sender, CyberCommServerEventArgs e)
96
{
97
if (ClientInfoDictionary.TryGetValue(e.CurrentWebSocket, out XFEConsoleClientInfo? clientInfo))
98
{
99
ClientInfoDictionary.Remove(e.CurrentWebSocket);
100
Disconnected?.Invoke(this, clientInfo);
101
}
102
}
103
104
private async void Server_ClientConnected(object? sender, CyberCommServerEventArgs e)
105
{
106
try
107
{
108
if (e.WSHeader["ClientName"] is not null && e.WSHeader["ClientID"] is not null && e.WSHeader["Password"] is not null)
109
{
110
var password = e.WSHeader["Password"]!;
111
var clientName = e.WSHeader["ClientName"]!;
112
var clientUUID = e.WSHeader["ClientID"]!;
113
if (password == Password)
114
{
115
var clientInfo = new XFEConsoleClientInfo(clientName, clientUUID, password, e);
116
ClientInfoDictionary.Add(e.CurrentWebSocket, clientInfo);
117
Connected?.Invoke(this, clientInfo);
118
}
119
return;
120
}
121
}
122
catch { }
123
try
124
{
125
await e.Close();
126
}
127
catch
128
{
129
try
130
{
131
e.ForceClose();
132
}
133
catch { }
134
}
135
}
136
137
private void Server_ServerStarted(object? sender, EventArgs e)
138
{
139
ClientInfoDictionary = [];
140
ServerStarted?.Invoke(this);
141
}
142
/// <summary>
143
/// 启动服务器
144
/// </summary>
145
/// <returns></returns>
146
public async Task StartServer()
147
{
148
await Server.StartCyberCommServer();
149
}
150
}
@@ -1,305 +0,0 @@
1
using System.Diagnostics.CodeAnalysis;
2
using System.IO;
3
using System.Text;
4
5
namespace XFEExtension.NetCore.XFEConsole;
6
7
/// <summary>
8
/// XFE控制台文本写入器
9
/// </summary>
10
public class XFEConsoleTextWriter : TextWriter
11
{
12
/// <inheritdoc/>
13
public override Encoding Encoding => Encoding.UTF8;
14
15
/// <inheritdoc/>
16
public override async void Write(bool value)
17
{
18
base.Write(value);
19
await XFEConsole.Write(value.ToString());
20
}
21
22
/// <inheritdoc/>
23
public override async void Write(char value)
24
{
25
base.Write(value);
26
await XFEConsole.Write(value.ToString());
27
}
28
29
/// <inheritdoc/>
30
public override async void Write(char[]? buffer)
31
{
32
base.Write(buffer);
33
if(buffer is not null)
34
{
35
var stringBuilder = new StringBuilder();
36
foreach (var sigChar in buffer)
37
{
38
stringBuilder.Append(sigChar);
39
}
40
await XFEConsole.Write(stringBuilder.ToString());
41
}
42
}
43
44
/// <inheritdoc/>
45
public override async void Write(char[] buffer, int index, int count)
46
{
47
base.Write(buffer, index, count);
48
for (int i = index; i < count; i++)
49
{
50
var stringBuilder = new StringBuilder();
51
stringBuilder.Append(buffer[i]);
52
await XFEConsole.Write(stringBuilder.ToString());
53
}
54
}
55
56
/// <inheritdoc/>
57
public override async void Write(decimal value)
58
{
59
base.Write(value);
60
await XFEConsole.Write(value.ToString());
61
}
62
63
/// <inheritdoc/>
64
public override async void Write(double value)
65
{
66
base.Write(value);
67
await XFEConsole.Write(value.ToString());
68
}
69
70
/// <inheritdoc/>
71
public override async void Write(int value)
72
{
73
base.Write(value);
74
await XFEConsole.Write(value.ToString());
75
}
76
77
/// <inheritdoc/>
78
public override async void Write(long value)
79
{
80
base.Write(value);
81
await XFEConsole.Write(value.ToString());
82
}
83
84
/// <inheritdoc/>
85
public override async void Write(object? value)
86
{
87
base.Write(value);
88
await XFEConsole.Write(value?.ToString());
89
}
90
91
/// <inheritdoc/>
92
public override async void Write(float value)
93
{
94
base.Write(value);
95
await XFEConsole.Write(value.ToString());
96
}
97
98
/// <inheritdoc/>
99
public override async void Write(string? value)
100
{
101
base.Write(value);
102
await XFEConsole.Write(value);
103
}
104
105
/// <inheritdoc/>
106
public override async void Write(StringBuilder? value)
107
{
108
base.Write(value);
109
await XFEConsole.Write(value?.ToString());
110
}
111
112
/// <inheritdoc/>
113
public override async void Write(uint value)
114
{
115
base.Write(value);
116
await XFEConsole.Write(value.ToString());
117
}
118
119
/// <inheritdoc/>
120
public override async void Write(ulong value)
121
{
122
base.Write(value);
123
await XFEConsole.Write(value.ToString());
124
}
125
126
/// <inheritdoc/>
127
public override async Task WriteAsync(char value)
128
{
129
await base.WriteAsync(value);
130
await XFEConsole.Write(value.ToString());
131
}
132
133
/// <inheritdoc/>
134
public override async Task WriteAsync(char[] buffer, int index, int count)
135
{
136
await base.WriteAsync(buffer, index, count);
137
for (int i = index; i < count; i++)
138
{
139
var stringBuilder = new StringBuilder();
140
stringBuilder.Append(buffer[i]);
141
await XFEConsole.Write(stringBuilder.ToString());
142
}
143
}
144
145
/// <inheritdoc/>
146
public override async Task WriteAsync(string? value)
147
{
148
await base.WriteAsync(value);
149
await XFEConsole.Write(value);
150
}
151
152
/// <inheritdoc/>
153
public override async void WriteLine()
154
{
155
base.WriteLine();
156
await XFEConsole.WriteLine("");
157
}
158
159
/// <inheritdoc/>
160
public override async void WriteLine(bool value)
161
{
162
base.WriteLine(value);
163
await XFEConsole.WriteLine(value.ToString());
164
}
165
166
/// <inheritdoc/>
167
public override async void WriteLine(char value)
168
{
169
base.WriteLine(value);
170
await XFEConsole.WriteLine(value.ToString());
171
}
172
173
/// <inheritdoc/>
174
public override async void WriteLine(char[]? buffer)
175
{
176
base.WriteLine(buffer);
177
if (buffer is not null)
178
{
179
var stringBuilder = new StringBuilder();
180
foreach (var sigChar in buffer)
181
{
182
stringBuilder.Append(sigChar);
183
}
184
await XFEConsole.WriteLine(stringBuilder.ToString());
185
}
186
}
187
188
/// <inheritdoc/>
189
public override async void WriteLine(char[] buffer, int index, int count)
190
{
191
base.WriteLine(buffer, index, count);
192
for (int i = index; i < count; i++)
193
{
194
var stringBuilder = new StringBuilder();
195
stringBuilder.Append(buffer[i]);
196
await XFEConsole.WriteLine(stringBuilder.ToString());
197
}
198
}
199
200
/// <inheritdoc/>
201
public override async void WriteLine(decimal value)
202
{
203
base.WriteLine(value);
204
await XFEConsole.WriteLine(value.ToString());
205
}
206
207
/// <inheritdoc/>
208
public override async void WriteLine(double value)
209
{
210
base.WriteLine(value);
211
await XFEConsole.WriteLine(value.ToString());
212
}
213
214
/// <inheritdoc/>
215
public override async void WriteLine(int value)
216
{
217
base.WriteLine(value);
218
await XFEConsole.WriteLine(value.ToString());
219
}
220
221
/// <inheritdoc/>
222
public override async void WriteLine(long value)
223
{
224
base.WriteLine(value);
225
await XFEConsole.WriteLine(value.ToString());
226
}
227
228
/// <inheritdoc/>
229
public override async void WriteLine(object? value)
230
{
231
base.WriteLine(value);
232
if(XFEConsole.AutoAnalyzeObject)
233
await XFEConsole.WriteObject(value);
234
else
235
await XFEConsole.WriteLine(value?.ToString());
236
}
237
238
/// <inheritdoc/>
239
public override async void WriteLine(float value)
240
{
241
base.WriteLine(value);
242
await XFEConsole.WriteLine(value.ToString());
243
}
244
245
/// <inheritdoc/>
246
public override async void WriteLine(string? value)
247
{
248
base.WriteLine(value);
249
await XFEConsole.WriteLine(value);
250
}
251
252
/// <inheritdoc/>
253
public override async void WriteLine(StringBuilder? value)
254
{
255
base.WriteLine(value);
256
await XFEConsole.WriteLine(value?.ToString());
257
}
258
259
/// <inheritdoc/>
260
public override async void WriteLine(uint value)
261
{
262
base.WriteLine(value);
263
await XFEConsole.WriteLine(value.ToString());
264
}
265
266
/// <inheritdoc/>
267
public override async void WriteLine(ulong value)
268
{
269
base.WriteLine(value);
270
await XFEConsole.WriteLine(value.ToString());
271
}
272
273
/// <inheritdoc/>
274
public override async Task WriteLineAsync()
275
{
276
await base.WriteLineAsync();
277
await XFEConsole.WriteLine("");
278
}
279
280
/// <inheritdoc/>
281
public override async Task WriteLineAsync(char value)
282
{
283
await base.WriteLineAsync(value);
284
await XFEConsole.WriteLine(value.ToString());
285
}
286
287
/// <inheritdoc/>
288
public override async Task WriteLineAsync(char[] buffer, int index, int count)
289
{
290
await base.WriteLineAsync(buffer, index, count);
291
for (int i = index; i < count; i++)
292
{
293
var stringBuilder = new StringBuilder();
294
stringBuilder.Append(buffer[i]);
295
await XFEConsole.WriteLine(stringBuilder.ToString());
296
}
297
}
298
299
/// <inheritdoc/>
300
public override async Task WriteLineAsync(string? value)
301
{
302
await base.WriteLineAsync(value);
303
await XFEConsole.WriteLine(value);
304
}
305
}
@@ -18,6 +18,7 @@ public partial class MainPage : Page
18
18
19
19
private void Page_Loaded(object sender, System.Windows.RoutedEventArgs e)
20
20
{
21
notifyText.Text = FileHelper.GetDirectorySize(new(@"C:\Users\XFEstudio\Downloads")).FileSize();
21
//notifyText.Text = FileHelper.GetDirectorySize(new(@"C:\Users\XFEstudio\Downloads")).FileSize();
22
notifyText.Text = "持续开发中...";
22
23
}
23
24
}
@@ -7,6 +7,7 @@
7
7
<ImplicitUsings>enable</ImplicitUsings>
8
8
<UseWPF>true</UseWPF>
9
9
<ApplicationIcon>Resources\Icon\XFEToolBoxIcon.ico</ApplicationIcon>
10
<Version>0.0.1</Version>
10
11
</PropertyGroup>
11
12
12
13
<ItemGroup>
@@ -31,7 +32,7 @@
31
32
32
33
<ItemGroup>
33
34
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
34
<PackageReference Include="XFEExtension.NetCore" Version="3.0.0" />
35
<PackageReference Include="XFEExtension.NetCore" Version="3.0.1" />
35
36
<PackageReference Include="XFEExtension.NetCore.AutoConfig" Version="1.1.1" />
36
37
<PackageReference Include="XFEExtension.NetCore.AutoPath" Version="1.0.1" />
37
38
<PackageReference Include="XFEExtension.NetCore.InputSimulator" Version="2.2.0" />