增加邮箱发信

This commit is contained in:
李志强 2026-04-28 10:55:58 +08:00
parent 0de0dc29e2
commit 82b3bc2cf0
38 changed files with 759 additions and 312 deletions

435
Form1.cs
View File

@ -1,10 +1,14 @@
using System.Net; using System.Net;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Runtime.InteropServices;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using AntdUI; using AntdUI;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using WinLabel = System.Windows.Forms.Label; using WinLabel = System.Windows.Forms.Label;
using WinPanel = System.Windows.Forms.Panel; using WinPanel = System.Windows.Forms.Panel;
using WinTextBox = System.Windows.Forms.TextBox; using WinTextBox = System.Windows.Forms.TextBox;
@ -13,6 +17,15 @@ namespace Vmianqian
{ {
public partial class Form1 : BorderlessForm public partial class Form1 : BorderlessForm
{ {
private const int WmNclButtonDown = 0x00A1;
private const int HtCaption = 0x0002;
[DllImport("user32.dll")]
private static extern bool ReleaseCapture();
[DllImport("user32.dll")]
private static extern nint SendMessage(nint hWnd, int msg, nint wParam, nint lParam);
private readonly string _configFilePath = Path.Combine(AppContext.BaseDirectory, "appsettings.client.json"); private readonly string _configFilePath = Path.Combine(AppContext.BaseDirectory, "appsettings.client.json");
private readonly JsonSerializerOptions _jsonOptions = new() { WriteIndented = true, PropertyNameCaseInsensitive = true }; private readonly JsonSerializerOptions _jsonOptions = new() { WriteIndented = true, PropertyNameCaseInsensitive = true };
private readonly HttpClient _httpClient = new(); private readonly HttpClient _httpClient = new();
@ -48,11 +61,18 @@ namespace Vmianqian
private AntdUI.Input txtServerUrl = null!; private AntdUI.Input txtServerUrl = null!;
private AntdUI.Input txtApiKey = null!; private AntdUI.Input txtApiKey = null!;
private AntdUI.Input txtSenderEmail = null!;
private AntdUI.Input txtSmtpHost = null!;
private AntdUI.Input txtSmtpPort = null!;
private AntdUI.Input txtNotifyEmail = null!; private AntdUI.Input txtNotifyEmail = null!;
private AntdUI.Input txtEmailAuthCode = null!;
private AntdUI.Label lblServerUrlTitle = null!; private AntdUI.Label lblServerUrlTitle = null!;
private AntdUI.Label lblApiKeyTitle = null!; private AntdUI.Label lblApiKeyTitle = null!;
private AntdUI.Label lblSenderEmailTitle = null!;
private AntdUI.Label lblSmtpHostTitle = null!;
private AntdUI.Label lblSmtpPortTitle = null!;
private AntdUI.Label lblNotifyEmailTitle = null!; private AntdUI.Label lblNotifyEmailTitle = null!;
private AntdUI.Label lblHeartbeatTitle = null!; private AntdUI.Label lblEmailAuthCodeTitle = null!;
private AntdUI.Label lblHeartbeatDesc = null!; private AntdUI.Label lblHeartbeatDesc = null!;
private AntdUI.Label lblMemberPlaceholder = null!; private AntdUI.Label lblMemberPlaceholder = null!;
private AntdUI.Switch chkHeartbeatEnabled = null!; private AntdUI.Switch chkHeartbeatEnabled = null!;
@ -77,8 +97,9 @@ namespace Vmianqian
private DataGridView gridAlipayLogs = null!; private DataGridView gridAlipayLogs = null!;
private AntdUI.Button btnSaveConfig = null!; private AntdUI.Button btnSaveConfig = null!;
private AntdUI.Button btnStartService = null!; private AntdUI.Button btnToggleService = null!;
private AntdUI.Button btnStopService = null!; private AntdUI.Button btnEmailSave = null!;
private AntdUI.Button btnEmailTest = null!;
public Form1() public Form1()
{ {
@ -93,11 +114,11 @@ namespace Vmianqian
BackColor = Color.White; BackColor = Color.White;
Font = new Font("Microsoft YaHei UI", 9F); Font = new Font("Microsoft YaHei UI", 9F);
Text = "V免签 Demo"; Text = "V免签 Demo";
MinimumSize = new Size(1180, 860); var fixedWindowSize = new Size(1200, 1000);
if (Width < 1280 || Height < 900) MinimumSize = fixedWindowSize;
{ MaximumSize = fixedWindowSize;
Size = new Size(1280, 900); Size = fixedWindowSize;
} MaximizeBox = false;
BuildTitlebar(); BuildTitlebar();
BuildBottomBar(); BuildBottomBar();
@ -119,14 +140,22 @@ namespace Vmianqian
DividerShow = true, DividerShow = true,
ShowButton = true, ShowButton = true,
ShowIcon = true, ShowIcon = true,
Text = "AntdUI", Text = "V免签PC客户端",
SubText = "Demo" SubText = "V0.0.1"
};
lblTopNotice = new AntdUI.Label
{
Dock = DockStyle.Fill,
Text = "监听未启动",
TextAlign = ContentAlignment.MiddleRight,
ForeColor = Color.DimGray
}; };
lblAlipayStatusValue = new AntdUI.Label lblAlipayStatusValue = new AntdUI.Label
{ {
Dock = DockStyle.Right, Dock = DockStyle.Right,
Width = 88, Width = 120,
Text = "支付宝: 离线", Text = "支付宝: 离线",
TextAlign = ContentAlignment.MiddleRight, TextAlign = ContentAlignment.MiddleRight,
ForeColor = Color.Red ForeColor = Color.Red
@ -135,7 +164,7 @@ namespace Vmianqian
lblWechatStatusValue = new AntdUI.Label lblWechatStatusValue = new AntdUI.Label
{ {
Dock = DockStyle.Right, Dock = DockStyle.Right,
Width = 76, Width = 120,
Text = "微信: 离线", Text = "微信: 离线",
TextAlign = ContentAlignment.MiddleRight, TextAlign = ContentAlignment.MiddleRight,
ForeColor = Color.Red ForeColor = Color.Red
@ -144,6 +173,11 @@ namespace Vmianqian
titlebar.Controls.Add(lblTopNotice); titlebar.Controls.Add(lblTopNotice);
titlebar.Controls.Add(lblAlipayStatusValue); titlebar.Controls.Add(lblAlipayStatusValue);
titlebar.Controls.Add(lblWechatStatusValue); titlebar.Controls.Add(lblWechatStatusValue);
EnableWindowDrag(titlebar);
EnableWindowDrag(lblTopNotice);
EnableWindowDrag(lblWechatStatusValue);
EnableWindowDrag(lblAlipayStatusValue);
} }
private void BuildBottomBar() private void BuildBottomBar()
@ -261,7 +295,7 @@ namespace Vmianqian
{ {
const int margin = 20; const int margin = 20;
const int gap = 16; const int gap = 16;
const int cardHeight = 360; const int cardHeight = 420;
var pageAvailableWidth = Math.Max(0, pageHome.ClientSize.Width - margin * 2); var pageAvailableWidth = Math.Max(0, pageHome.ClientSize.Width - margin * 2);
pageHome.SuspendLayout(); pageHome.SuspendLayout();
@ -272,10 +306,19 @@ namespace Vmianqian
if (summaryCard != null) if (summaryCard != null)
{ {
summaryCard.SuspendLayout(); summaryCard.SuspendLayout();
summaryCard.Bounds = new Rectangle(margin, 20, pageAvailableWidth, 120); lblSummaryTitle.Location = new Point(28, 20);
lblSummaryTitle.Location = new Point(28, 24); var summaryDescTop = lblSummaryTitle.Bottom + 8;
lblSummaryDesc.Location = new Point(30, 64); var summaryDescWidth = Math.Max(220, pageAvailableWidth - 56);
lblSummaryDesc.Size = new Size(Math.Max(220, pageAvailableWidth - 60), 28); var summaryDescPreferred = TextRenderer.MeasureText(
lblSummaryDesc.Text,
lblSummaryDesc.Font,
new Size(summaryDescWidth, 0),
TextFormatFlags.WordBreak);
var summaryDescHeight = Math.Max(24, summaryDescPreferred.Height);
lblSummaryDesc.Location = new Point(28, summaryDescTop);
lblSummaryDesc.Size = new Size(summaryDescWidth, summaryDescHeight);
var summaryHeight = Math.Max(120, summaryDescTop + summaryDescHeight + 20);
summaryCard.Bounds = new Rectangle(margin, 20, pageAvailableWidth, summaryHeight);
top = summaryCard.Bottom + margin; top = summaryCard.Bottom + margin;
summaryCard.ResumeLayout(false); summaryCard.ResumeLayout(false);
} }
@ -306,25 +349,19 @@ namespace Vmianqian
lblApiKeyTitle.Location = new Point(contentLeft, 94); lblApiKeyTitle.Location = new Point(contentLeft, 94);
txtApiKey.Location = new Point(contentLeft, 122); txtApiKey.Location = new Point(contentLeft, 122);
txtApiKey.Width = inputWidth; txtApiKey.Width = inputWidth;
lblNotifyEmailTitle.Location = new Point(contentLeft, 168);
txtNotifyEmail.Location = new Point(contentLeft, 196);
txtNotifyEmail.Width = inputWidth;
const int actionTop = 252; const int actionTop = 252;
const int buttonGap = 12; const int buttonGap = 12;
var actionButtonWidth = Math.Max(72, (contentWidth - buttonGap * 3) / 4); var actionButtonWidth = Math.Max(72, (contentWidth - buttonGap * 2) / 3);
btnSaveConfig.Location = new Point(24, actionTop); btnSaveConfig.Location = new Point(24, actionTop);
btnSaveConfig.Size = new Size(actionButtonWidth, 36); btnSaveConfig.Size = new Size(actionButtonWidth, 36);
btnStartService.Location = new Point(btnSaveConfig.Right + buttonGap, actionTop); btnToggleService.Location = new Point(btnSaveConfig.Right + buttonGap, actionTop);
btnStartService.Size = new Size(actionButtonWidth, 36); btnToggleService.Size = new Size(actionButtonWidth, 36);
btnStopService.Location = new Point(btnStartService.Right + buttonGap, actionTop); btnHeartbeatCheck.Location = new Point(btnToggleService.Right + buttonGap, actionTop);
btnStopService.Size = new Size(actionButtonWidth, 36);
btnHeartbeatCheck.Location = new Point(btnStopService.Right + buttonGap, actionTop);
btnHeartbeatCheck.Size = new Size(actionButtonWidth, 34); btnHeartbeatCheck.Size = new Size(actionButtonWidth, 34);
const int heartbeatTop = 300; const int heartbeatTop = 300;
lblHeartbeatTitle.Location = new Point(contentLeft, heartbeatTop); chkHeartbeatEnabled.Location = new Point(contentLeft, heartbeatTop - 4);
chkHeartbeatEnabled.Location = new Point(98, heartbeatTop - 4);
lblHeartbeatDesc.Location = new Point(chkHeartbeatEnabled.Right + 4, heartbeatTop + 1); lblHeartbeatDesc.Location = new Point(chkHeartbeatEnabled.Right + 4, heartbeatTop + 1);
lblMemberPlaceholder.Size = new Size(Math.Max(220, memberCard.ClientSize.Width - 48), 52); lblMemberPlaceholder.Size = new Size(Math.Max(220, memberCard.ClientSize.Width - 48), 52);
@ -403,6 +440,33 @@ namespace Vmianqian
private void LayoutSettingsPage() private void LayoutSettingsPage()
{ {
LayoutPageCards(pageSettings, 20); LayoutPageCards(pageSettings, 20);
var listenCard = FindCard(pageSettings, "settings-listen");
var emailCard = FindCard(pageSettings, "settings-email");
if (listenCard == null || emailCard == null)
{
return;
}
listenCard.Top = 20;
emailCard.Top = listenCard.Bottom + 16;
var listenInputWidth = Math.Max(220, listenCard.ClientSize.Width - 48);
txtServicePort.Width = Math.Min(220, listenInputWidth);
txtListenPath.Width = Math.Min(360, listenInputWidth);
var emailInputWidth = Math.Max(220, Math.Min(520, emailCard.ClientSize.Width - 48));
txtSenderEmail.Width = emailInputWidth;
txtSmtpHost.Width = emailInputWidth;
txtNotifyEmail.Width = emailInputWidth;
txtSmtpPort.Width = Math.Min(220, emailInputWidth);
var authCodeWidth = Math.Max(260, Math.Min(360, emailCard.ClientSize.Width - 584 - 24));
var authCodeLeft = Math.Max(24, emailCard.ClientSize.Width - authCodeWidth - 24);
lblEmailAuthCodeTitle.Location = new Point(authCodeLeft, 278);
txtEmailAuthCode.Location = new Point(authCodeLeft, 306);
txtEmailAuthCode.Width = authCodeWidth;
btnEmailSave.Location = new Point(24, 350);
btnEmailTest.Location = new Point(btnEmailSave.Right + 12, 350);
} }
private static void LayoutPageCards(WinPanel page, int margin) private static void LayoutPageCards(WinPanel page, int margin)
@ -446,8 +510,7 @@ namespace Vmianqian
{ {
Text = "当前阶段先打通“PC端本地监听 -> V免签服务端回调 -> 心跳检测”链路,整体布局按 AntdUI Demo 风格复刻。", Text = "当前阶段先打通“PC端本地监听 -> V免签服务端回调 -> 心跳检测”链路,整体布局按 AntdUI Demo 风格复刻。",
AutoSize = false, AutoSize = false,
Location = new Point(30, 64), Location = new Point(70, 64),
Size = new Size(980, 28),
ForeColor = Color.DimGray ForeColor = Color.DimGray
}; };
@ -467,11 +530,6 @@ namespace Vmianqian
txtApiKey = CreateInput(24, 122, 500, "请输入与服务端密钥"); txtApiKey = CreateInput(24, 122, 500, "请输入与服务端密钥");
configCard.Controls.Add(txtApiKey); configCard.Controls.Add(txtApiKey);
lblNotifyEmailTitle = CreateTitleLabel("通知邮箱", 24, 168);
configCard.Controls.Add(lblNotifyEmailTitle);
txtNotifyEmail = CreateInput(24, 196, 500, "可选");
configCard.Controls.Add(txtNotifyEmail);
btnSaveConfig = new AntdUI.Button btnSaveConfig = new AntdUI.Button
{ {
Text = "保存配置", Text = "保存配置",
@ -481,33 +539,21 @@ namespace Vmianqian
}; };
btnSaveConfig.Click += btnSaveConfig_Click; btnSaveConfig.Click += btnSaveConfig_Click;
btnStartService = new AntdUI.Button btnToggleService = new AntdUI.Button
{ {
Text = "启动监听", Text = "启动监听",
Type = TTypeMini.Primary, Type = TTypeMini.Primary,
Location = new Point(146, 252), Location = new Point(146, 292),
Size = new Size(110, 36), Size = new Size(110, 36),
}; };
btnStartService.Click += btnStart_Click; btnToggleService.Click += btnToggleService_Click;
btnStopService = new AntdUI.Button
{
Text = "停止监听",
Type = TTypeMini.Primary,
Location = new Point(268, 252),
Size = new Size(110, 36),
};
btnStopService.Click += btnStop_Click;
configCard.Controls.Add(btnSaveConfig); configCard.Controls.Add(btnSaveConfig);
configCard.Controls.Add(btnStartService); configCard.Controls.Add(btnToggleService);
configCard.Controls.Add(btnStopService);
lblHeartbeatTitle = CreateTitleLabel("心跳检测", 24, 300);
configCard.Controls.Add(lblHeartbeatTitle);
chkHeartbeatEnabled = new AntdUI.Switch chkHeartbeatEnabled = new AntdUI.Switch
{ {
Location = new Point(98, 296), Location = new Point(24, 296),
Size = new Size(62, 28), Size = new Size(62, 28),
AutoSize = false AutoSize = false
}; };
@ -517,15 +563,15 @@ namespace Vmianqian
{ {
Text = "自动心跳", Text = "自动心跳",
AutoSize = true, AutoSize = true,
Location = new Point(164, 301), Location = new Point(90, 301),
ForeColor = Color.DimGray ForeColor = Color.DimGray
}; };
btnHeartbeatCheck = new AntdUI.Button btnHeartbeatCheck = new AntdUI.Button
{ {
Text = "立即检测", Text = "心跳检测",
Type = TTypeMini.Primary, Type = TTypeMini.Primary,
Location = new Point(390, 292), Location = new Point(268, 292),
Size = new Size(110, 34) Size = new Size(110, 34)
}; };
btnHeartbeatCheck.Click += btnHeartbeatCheck_Click; btnHeartbeatCheck.Click += btnHeartbeatCheck_Click;
@ -697,29 +743,81 @@ namespace Vmianqian
private void BuildSettingsPage() private void BuildSettingsPage()
{ {
var card = CreateCardPanel(new Rectangle(20, 20, 1080, 260)); var listenCard = CreateCardPanel(new Rectangle(20, 20, 1080, 200));
card.Tag = "settings-main"; listenCard.Tag = "settings-listen";
card.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; listenCard.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
card.Controls.Add(CreateTitleLabel("本地监听端口", 24, 20)); listenCard.Controls.Add(CreateTitleLabel("本地监听端口", 24, 20));
txtServicePort = CreateInput(24, 48, 180, "8989"); txtServicePort = CreateInput(24, 48, 180, "8989");
card.Controls.Add(txtServicePort); listenCard.Controls.Add(txtServicePort);
card.Controls.Add(CreateTitleLabel("本地监听路径", 240, 20)); listenCard.Controls.Add(CreateTitleLabel("本地监听路径", 240, 20));
txtListenPath = CreateInput(240, 48, 240, "/notify/"); txtListenPath = CreateInput(240, 48, 240, "/notify/");
card.Controls.Add(txtListenPath); listenCard.Controls.Add(txtListenPath);
var info = new AntdUI.Label var info = new AntdUI.Label
{ {
Text = "这个页面用于维护本地监听设置与项目说明。\r\n\r\n目标顺序\r\n1. 先让本地监听和服务端回调稳定运行\r\n2. 再接入微信 PC 端监听\r\n3. 再接入支付宝 PC 端监听", Text = "这个页面用于维护本地监听、邮箱通知与项目说明。",
AutoSize = false, AutoSize = false,
Location = new Point(24, 105), Location = new Point(24, 108),
Size = new Size(920, 120), Size = new Size(920, 60),
ForeColor = Color.DimGray ForeColor = Color.DimGray
}; };
card.Controls.Add(info); listenCard.Controls.Add(info);
pageSettings.Controls.Add(card); var emailCard = CreateCardPanel(new Rectangle(20, 236, 1080, 420));
emailCard.Tag = "settings-email";
emailCard.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
emailCard.Controls.Add(CreateTitleLabel("邮箱通知配置", 24, 20));
lblSenderEmailTitle = CreateTitleLabel("发送邮箱", 24, 56);
emailCard.Controls.Add(lblSenderEmailTitle);
txtSenderEmail = CreateInput(24, 84, 500, "例如yunzer_cn@163.com");
emailCard.Controls.Add(txtSenderEmail);
lblSmtpHostTitle = CreateTitleLabel("SMTP 主机", 24, 130);
emailCard.Controls.Add(lblSmtpHostTitle);
txtSmtpHost = CreateInput(24, 158, 500, "例如smtp.163.com");
emailCard.Controls.Add(txtSmtpHost);
lblSmtpPortTitle = CreateTitleLabel("SMTP 端口", 24, 204);
emailCard.Controls.Add(lblSmtpPortTitle);
txtSmtpPort = CreateInput(24, 232, 220, "例如465");
emailCard.Controls.Add(txtSmtpPort);
lblNotifyEmailTitle = CreateTitleLabel("通知邮箱", 24, 278);
emailCard.Controls.Add(lblNotifyEmailTitle);
txtNotifyEmail = CreateInput(24, 306, 500, "用于接收测试邮件");
emailCard.Controls.Add(txtNotifyEmail);
lblEmailAuthCodeTitle = CreateTitleLabel("授权码", 560, 278);
emailCard.Controls.Add(lblEmailAuthCodeTitle);
txtEmailAuthCode = CreateInput(560, 306, 320, "用于发送测试邮件");
emailCard.Controls.Add(txtEmailAuthCode);
btnEmailSave = new AntdUI.Button
{
Text = "保存配置",
Type = TTypeMini.Primary,
Location = new Point(24, 350),
Size = new Size(110, 36)
};
btnEmailSave.Click += btnEmailSave_Click;
emailCard.Controls.Add(btnEmailSave);
btnEmailTest = new AntdUI.Button
{
Text = "邮箱测试",
Type = TTypeMini.Primary,
Ghost = true,
Location = new Point(146, 350),
Size = new Size(110, 36)
};
btnEmailTest.Click += btnEmailTest_Click;
emailCard.Controls.Add(btnEmailTest);
pageSettings.Controls.Add(listenCard);
pageSettings.Controls.Add(emailCard);
} }
private WinPanel CreateCardPanel(Rectangle bounds) private WinPanel CreateCardPanel(Rectangle bounds)
@ -928,7 +1026,11 @@ namespace Vmianqian
{ {
txtServerUrl.Text = _config.ServerUrl; txtServerUrl.Text = _config.ServerUrl;
txtApiKey.Text = _config.ApiKey; txtApiKey.Text = _config.ApiKey;
txtSenderEmail.Text = _config.SenderEmail;
txtSmtpHost.Text = _config.SmtpHost;
txtSmtpPort.Text = _config.SmtpPort.ToString();
txtNotifyEmail.Text = _config.NotifyEmail; txtNotifyEmail.Text = _config.NotifyEmail;
txtEmailAuthCode.Text = _config.EmailAuthCode;
txtWechatPath.Text = _config.WechatPath; txtWechatPath.Text = _config.WechatPath;
txtWechatId.Text = _config.WechatSid; txtWechatId.Text = _config.WechatSid;
txtAliPath.Text = _config.AlipayPath; txtAliPath.Text = _config.AlipayPath;
@ -946,7 +1048,11 @@ namespace Vmianqian
{ {
_config.ServerUrl = NormalizeServerUrl(txtServerUrl.Text); _config.ServerUrl = NormalizeServerUrl(txtServerUrl.Text);
_config.ApiKey = txtApiKey.Text.Trim(); _config.ApiKey = txtApiKey.Text.Trim();
_config.SenderEmail = txtSenderEmail.Text.Trim();
_config.SmtpHost = txtSmtpHost.Text.Trim();
_config.SmtpPort = ParseSmtpPort(txtSmtpPort.Text);
_config.NotifyEmail = txtNotifyEmail.Text.Trim(); _config.NotifyEmail = txtNotifyEmail.Text.Trim();
_config.EmailAuthCode = txtEmailAuthCode.Text.Trim();
_config.WechatPath = txtWechatPath.Text.Trim(); _config.WechatPath = txtWechatPath.Text.Trim();
_config.WechatSid = txtWechatId.Text.Trim(); _config.WechatSid = txtWechatId.Text.Trim();
_config.AlipayPath = txtAliPath.Text.Trim(); _config.AlipayPath = txtAliPath.Text.Trim();
@ -970,6 +1076,16 @@ namespace Vmianqian
return port; return port;
} }
private static int ParseSmtpPort(string text)
{
if (!int.TryParse(text, out var port) || port < 1 || port > 65535)
{
return 465;
}
return port;
}
private void btnSaveConfig_Click(object? sender, EventArgs e) private void btnSaveConfig_Click(object? sender, EventArgs e)
{ {
try try
@ -986,8 +1102,16 @@ namespace Vmianqian
} }
} }
private async void btnStart_Click(object? sender, EventArgs e) private async void btnToggleService_Click(object? sender, EventArgs e)
{ {
if (IsListenerRunning())
{
StopListener();
UpdateServiceStatus(false);
Log("监听已停止。");
return;
}
try try
{ {
SaveUiToConfig(); SaveUiToConfig();
@ -1005,11 +1129,66 @@ namespace Vmianqian
} }
} }
private void btnStop_Click(object? sender, EventArgs e) private async void btnEmailTest_Click(object? sender, EventArgs e)
{ {
StopListener(); try
UpdateServiceStatus(false); {
Log("监听已停止。"); SaveUiToConfig();
if (string.IsNullOrWhiteSpace(_config.NotifyEmail))
{
throw new InvalidOperationException("请先填写通知邮箱。");
}
if (string.IsNullOrWhiteSpace(_config.SenderEmail))
{
throw new InvalidOperationException("请先填写发送邮箱。");
}
if (string.IsNullOrWhiteSpace(_config.SmtpHost))
{
throw new InvalidOperationException("请先填写 SMTP 主机。");
}
if (_config.SmtpPort <= 0)
{
throw new InvalidOperationException("请先填写有效的 SMTP 端口。");
}
if (string.IsNullOrWhiteSpace(_config.EmailAuthCode))
{
throw new InvalidOperationException("请先填写邮箱授权码。");
}
await SendTestEmailAsync(
_config.SenderEmail.Trim(),
_config.NotifyEmail.Trim(),
_config.SmtpHost.Trim(),
_config.SmtpPort,
_config.EmailAuthCode.Trim());
Log($"测试邮件已发送:{_config.NotifyEmail}");
MessageBox.Show("测试邮件发送成功。", "邮箱测试", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
Log($"测试邮件发送失败:{ex.Message}");
MessageBox.Show(ex.Message, "邮箱测试失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnEmailSave_Click(object? sender, EventArgs e)
{
try
{
SaveUiToConfig();
SaveConfig();
Log("邮箱配置已保存到本地缓存文件。");
MessageBox.Show("邮箱配置已保存。", "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
Log($"保存邮箱配置失败:{ex.Message}");
MessageBox.Show(ex.Message, "保存失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
} }
private async Task StartListenerAsync() private async Task StartListenerAsync()
@ -1027,6 +1206,11 @@ namespace Vmianqian
await Task.CompletedTask; await Task.CompletedTask;
} }
private bool IsListenerRunning()
{
return _httpListener is { IsListening: true };
}
private void StopListener() private void StopListener()
{ {
try try
@ -1061,6 +1245,84 @@ namespace Vmianqian
_listenerCancellationTokenSource = null; _listenerCancellationTokenSource = null;
} }
private async Task SendTestEmailAsync(string senderEmail, string notifyEmail, string smtpHost, int smtpPort, string authCode)
{
var errors = new List<string>();
var attempts = new List<(int Port, SecureSocketOptions SocketOptions)>
{
(smtpPort, smtpPort == 465 ? SecureSocketOptions.SslOnConnect : SecureSocketOptions.StartTls),
(smtpPort, SecureSocketOptions.StartTlsWhenAvailable),
(smtpPort, SecureSocketOptions.Auto)
};
if (smtpPort == 465)
{
attempts.Add((587, SecureSocketOptions.StartTls));
attempts.Add((587, SecureSocketOptions.StartTlsWhenAvailable));
}
else if (smtpPort == 587)
{
attempts.Add((465, SecureSocketOptions.SslOnConnect));
attempts.Add((465, SecureSocketOptions.Auto));
}
foreach (var (port, socketOptions) in attempts.Distinct())
{
if (await TrySendTestEmailAsync(senderEmail, notifyEmail, smtpHost, port, socketOptions, authCode, errors))
{
return;
}
}
throw new InvalidOperationException("测试邮件发送失败:" + Environment.NewLine + string.Join(Environment.NewLine, errors));
}
private static async Task<bool> TrySendTestEmailAsync(string senderEmail, string notifyEmail, string smtpHost, int smtpPort, SecureSocketOptions socketOptions, string authCode, List<string> errors)
{
try
{
var message = new MimeMessage();
message.From.Add(MailboxAddress.Parse(senderEmail));
message.To.Add(MailboxAddress.Parse(notifyEmail));
message.Subject = "V免签客户端测试邮件";
message.Body = new TextPart("plain")
{
Text = $"这是一封测试邮件,发送时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"
};
using var smtp = new SmtpClient
{
Timeout = 15000
};
await smtp.ConnectAsync(smtpHost, smtpPort, socketOptions);
await smtp.AuthenticateAsync(senderEmail, authCode);
await smtp.SendAsync(message);
await smtp.DisconnectAsync(true);
return true;
}
catch (Exception ex)
{
errors.Add($"SMTP {smtpHost}:{smtpPort} Socket={socketOptions} -> {GetDetailedExceptionMessage(ex)}");
return false;
}
}
private static string GetDetailedExceptionMessage(Exception ex)
{
var parts = new List<string>();
Exception? current = ex;
while (current != null)
{
if (!string.IsNullOrWhiteSpace(current.Message))
{
parts.Add(current.Message.Trim());
}
current = current.InnerException;
}
return parts.Count == 0 ? ex.GetType().Name : string.Join(" | ", parts.Distinct());
}
private async Task ListenLoopAsync(CancellationToken cancellationToken) private async Task ListenLoopAsync(CancellationToken cancellationToken)
{ {
if (_httpListener == null) if (_httpListener == null)
@ -1412,9 +1674,34 @@ namespace Vmianqian
private void UpdateServiceStatus(bool isRunning) private void UpdateServiceStatus(bool isRunning)
{ {
if (lblTopNotice is null)
{
return;
}
lblTopNotice.Text = isRunning lblTopNotice.Text = isRunning
? $"监听中:{BuildLocalListenUrl(_config)}" ? $"监听中:{BuildLocalListenUrl(_config)}"
: "监听未启动"; : "监听未启动";
if (btnToggleService != null)
{
btnToggleService.Text = isRunning ? "停止监听" : "启动监听";
btnToggleService.Type = isRunning ? TTypeMini.Error : TTypeMini.Primary;
}
}
private void EnableWindowDrag(Control control)
{
control.MouseDown += (_, e) =>
{
if (e.Button != MouseButtons.Left)
{
return;
}
ReleaseCapture();
SendMessage(Handle, WmNclButtonDown, HtCaption, 0);
};
} }
private static void ValidateConfig(ClientConfig config) private static void ValidateConfig(ClientConfig config)
@ -1551,7 +1838,11 @@ namespace Vmianqian
{ {
public string ServerUrl { get; set; } = string.Empty; public string ServerUrl { get; set; } = string.Empty;
public string ApiKey { get; set; } = string.Empty; public string ApiKey { get; set; } = string.Empty;
public string SenderEmail { get; set; } = string.Empty;
public string SmtpHost { get; set; } = string.Empty;
public int SmtpPort { get; set; } = 465;
public string NotifyEmail { get; set; } = string.Empty; public string NotifyEmail { get; set; } = string.Empty;
public string EmailAuthCode { get; set; } = string.Empty;
public string WechatPath { get; set; } = string.Empty; public string WechatPath { get; set; } = string.Empty;
public string WechatSid { get; set; } = string.Empty; public string WechatSid { get; set; } = string.Empty;
public string AlipayPath { get; set; } = string.Empty; public string AlipayPath { get; set; } = string.Empty;

View File

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
@ -6,10 +6,12 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GitRepositoryConfigurationScope>local</GitRepositoryConfigurationScope>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AntdUI" Version="2.3.10" /> <PackageReference Include="AntdUI" Version="2.3.10" />
<PackageReference Include="MailKit" Version="4.16.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,207 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<Compile Update="antdui-demo\MainWindow.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="antdui-demo\Views\AlertDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\AvatarDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\BadgeDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\BatteryDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\BreadcrumbDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ButtonDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\CalendarDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\CarouselDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ChatListDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\CheckBoxDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\CollapseDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ColorPickerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ContextMenuStripDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\DatePickerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\DatePickerRangeDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\DividerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\DrawerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\DropDownDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\FloatButtonDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\FlowPanelDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\GridPanelDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\IconDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\Image3DDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\InputDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\InputNumberDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\LabelDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\LabelTimeDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\MenuDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\MessageDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ModalDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\MsgListDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\NotificationDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\PageHeaderDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\PaginationDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\PanelDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\PopoverDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\PreviewDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\ProgressDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\RadioDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\RateDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SegmentedDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SelectDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SelectMultipleDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SignalDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SliderDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SliderRangeDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SpinDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SplitterDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\StackPanelDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\StepsDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\Demo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\InputTable.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\SystemSet.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\TourTest.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\UserEdit.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SubView\Wellcome.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\SwitchDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TableDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TabsDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TagDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TimelineDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TimePickerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TooltipDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TourDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\TreeDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="antdui-demo\Views\UploadDraggerDemo.cs">
<SubType>UserControl</SubType>
</Compile>
<Compile Update="Form1.cs"> <Compile Update="Form1.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>

Binary file not shown.

Binary file not shown.

View File

@ -8,7 +8,8 @@
".NETCoreApp,Version=v10.0": { ".NETCoreApp,Version=v10.0": {
"Vmianqian/1.0.0": { "Vmianqian/1.0.0": {
"dependencies": { "dependencies": {
"AntdUI": "2.3.10" "AntdUI": "2.3.10",
"MailKit": "4.16.0"
}, },
"runtime": { "runtime": {
"Vmianqian.dll": {} "Vmianqian.dll": {}
@ -21,6 +22,36 @@
"fileVersion": "2.3.10.0" "fileVersion": "2.3.10.0"
} }
} }
},
"BouncyCastle.Cryptography/2.6.2": {
"runtime": {
"lib/net6.0/BouncyCastle.Cryptography.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.6.2.46322"
}
}
},
"MailKit/4.16.0": {
"dependencies": {
"MimeKit": "4.16.0"
},
"runtime": {
"lib/net10.0/MailKit.dll": {
"assemblyVersion": "4.16.0.0",
"fileVersion": "4.16.0.0"
}
}
},
"MimeKit/4.16.0": {
"dependencies": {
"BouncyCastle.Cryptography": "2.6.2"
},
"runtime": {
"lib/net10.0/MimeKit.dll": {
"assemblyVersion": "4.16.0.0",
"fileVersion": "4.16.0.0"
}
}
} }
} }
}, },
@ -36,6 +67,27 @@
"sha512": "sha512-twjNYhVIw08ydcQsBC5c7/59WBXVqba4kulN48ejxUz2i37xJU6ukYqUtxEFhiQtVzmu8cmGYAjZ4HM6BOKZwg==", "sha512": "sha512-twjNYhVIw08ydcQsBC5c7/59WBXVqba4kulN48ejxUz2i37xJU6ukYqUtxEFhiQtVzmu8cmGYAjZ4HM6BOKZwg==",
"path": "antdui/2.3.10", "path": "antdui/2.3.10",
"hashPath": "antdui.2.3.10.nupkg.sha512" "hashPath": "antdui.2.3.10.nupkg.sha512"
},
"BouncyCastle.Cryptography/2.6.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==",
"path": "bouncycastle.cryptography/2.6.2",
"hashPath": "bouncycastle.cryptography.2.6.2.nupkg.sha512"
},
"MailKit/4.16.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-trJ82DOpAmo8i1jO1vNE+dGn4mPRyeYfy4swRcAGgMJhPoI1Kohf4OFJJf0+YIj4iUxgxPn8W+ht7e7KiYzSjg==",
"path": "mailkit/4.16.0",
"hashPath": "mailkit.4.16.0.nupkg.sha512"
},
"MimeKit/4.16.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-X0LFxeM4gPRIhODyY/HYS9b+zRZ7y//v59rFzgS6wLxcPuZThnMtNZHtrr0fjLyRRkg3gqJBtvW36XfUzZ7Djw==",
"path": "mimekit/4.16.0",
"hashPath": "mimekit.4.16.0.nupkg.sha512"
} }
} }
} }

View File

@ -1,7 +1,11 @@
{ {
"ServerUrl": "https://zf.yunzer.cn", "ServerUrl": "https://zf.yunzer.cn",
"ApiKey": "7eed756ca37ca057370ea9bb208d25fa", "ApiKey": "7eed756ca37ca057370ea9bb208d25fa",
"SenderEmail": "yunzer_cn@163.com",
"SmtpHost": "smtp.163.com",
"SmtpPort": 465,
"NotifyEmail": "1066960883@qq.com", "NotifyEmail": "1066960883@qq.com",
"EmailAuthCode": "TPPMKSMvCadyzu3m",
"WechatPath": "", "WechatPath": "",
"WechatSid": "", "WechatSid": "",
"AlipayPath": "", "AlipayPath": "",

BIN
bin_temp/AntdUI.dll Normal file

Binary file not shown.

Binary file not shown.

BIN
bin_temp/MailKit.dll Normal file

Binary file not shown.

BIN
bin_temp/MimeKit.dll Normal file

Binary file not shown.

View File

@ -0,0 +1,93 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"Vmianqian/1.0.0": {
"dependencies": {
"AntdUI": "2.3.10",
"MailKit": "4.16.0"
},
"runtime": {
"Vmianqian.dll": {}
}
},
"AntdUI/2.3.10": {
"runtime": {
"lib/net10.0-windows7.0/AntdUI.dll": {
"assemblyVersion": "2.3.10.0",
"fileVersion": "2.3.10.0"
}
}
},
"BouncyCastle.Cryptography/2.6.2": {
"runtime": {
"lib/net6.0/BouncyCastle.Cryptography.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.6.2.46322"
}
}
},
"MailKit/4.16.0": {
"dependencies": {
"MimeKit": "4.16.0"
},
"runtime": {
"lib/net10.0/MailKit.dll": {
"assemblyVersion": "4.16.0.0",
"fileVersion": "4.16.0.0"
}
}
},
"MimeKit/4.16.0": {
"dependencies": {
"BouncyCastle.Cryptography": "2.6.2"
},
"runtime": {
"lib/net10.0/MimeKit.dll": {
"assemblyVersion": "4.16.0.0",
"fileVersion": "4.16.0.0"
}
}
}
}
},
"libraries": {
"Vmianqian/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"AntdUI/2.3.10": {
"type": "package",
"serviceable": true,
"sha512": "sha512-twjNYhVIw08ydcQsBC5c7/59WBXVqba4kulN48ejxUz2i37xJU6ukYqUtxEFhiQtVzmu8cmGYAjZ4HM6BOKZwg==",
"path": "antdui/2.3.10",
"hashPath": "antdui.2.3.10.nupkg.sha512"
},
"BouncyCastle.Cryptography/2.6.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==",
"path": "bouncycastle.cryptography/2.6.2",
"hashPath": "bouncycastle.cryptography.2.6.2.nupkg.sha512"
},
"MailKit/4.16.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-trJ82DOpAmo8i1jO1vNE+dGn4mPRyeYfy4swRcAGgMJhPoI1Kohf4OFJJf0+YIj4iUxgxPn8W+ht7e7KiYzSjg==",
"path": "mailkit/4.16.0",
"hashPath": "mailkit.4.16.0.nupkg.sha512"
},
"MimeKit/4.16.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-X0LFxeM4gPRIhODyY/HYS9b+zRZ7y//v59rFzgS6wLxcPuZThnMtNZHtrr0fjLyRRkg3gqJBtvW36XfUzZ7Djw==",
"path": "mimekit/4.16.0",
"hashPath": "mimekit.4.16.0.nupkg.sha512"
}
}
}

BIN
bin_temp/Vmianqian.dll Normal file

Binary file not shown.

BIN
bin_temp/Vmianqian.exe Normal file

Binary file not shown.

BIN
bin_temp/Vmianqian.pdb Normal file

Binary file not shown.

View File

@ -0,0 +1,19 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false
}
}
}

View File

@ -14,12 +14,12 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Vmianqian")] [assembly: System.Reflection.AssemblyCompanyAttribute("Vmianqian")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1b6455593a6213b2e6fa56d99e52d99b3ceab81b")] [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0de0dc29e29fb873a83396b40d1d356b96fd403f")]
[assembly: System.Reflection.AssemblyProductAttribute("Vmianqian")] [assembly: System.Reflection.AssemblyProductAttribute("Vmianqian")]
[assembly: System.Reflection.AssemblyTitleAttribute("Vmianqian")] [assembly: System.Reflection.AssemblyTitleAttribute("Vmianqian")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] [assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
// Generated by the MSBuild WriteCodeFragment class. // 由 MSBuild WriteCodeFragment 类生成。

View File

@ -1 +1 @@
947e2bf078e14f00a06d6a610ce423bc783b4ea6779f9a00be7651fb9ae1d425 2470aa52bf7c9d2f34f885ab74c7c3690d381bd0289dbaafe7d1e260701d7524

View File

@ -16,7 +16,7 @@ build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules = build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Vmianqian build_property.RootNamespace = Vmianqian
build_property.ProjectDir = E:\Demo\C\Vmianqian\ build_property.ProjectDir = E:\Demos\DemoOwns\C\VmianqianC\
build_property.EnableComHosting = build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop = build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.CsWinRTUseWindowsUIXamlProjections = false build_property.CsWinRTUseWindowsUIXamlProjections = false

View File

@ -1 +1 @@
d16415670cf935c5792f13225a100e298ac07b7e6e8b89ede2c6253cce6cee33 1444586d3f97cf78236527678a31115203cb3c8ebe795b8d0d33e2075e906f3f

View File

@ -22,3 +22,34 @@ E:\Demo\C\Vmianqian\build_verify\Vmianqian.runtimeconfig.json
E:\Demo\C\Vmianqian\build_verify\Vmianqian.dll E:\Demo\C\Vmianqian\build_verify\Vmianqian.dll
E:\Demo\C\Vmianqian\build_verify\Vmianqian.pdb E:\Demo\C\Vmianqian\build_verify\Vmianqian.pdb
E:\Demo\C\Vmianqian\build_verify\AntdUI.dll E:\Demo\C\Vmianqian\build_verify\AntdUI.dll
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.csproj.AssemblyReference.cache
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.Form1.resources
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.csproj.GenerateResource.cache
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.GeneratedMSBuildEditorConfig.editorconfig
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.AssemblyInfoInputs.cache
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.AssemblyInfo.cs
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.csproj.CoreCompileInputs.cache
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.dll
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\refint\Vmianqian.dll
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.pdb
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\Vmianqian.exe
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\Vmianqian.deps.json
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\Vmianqian.runtimeconfig.json
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\Vmianqian.dll
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\Vmianqian.pdb
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\AntdUI.dll
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.csproj.Up2Date
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\Vmianqian.genruntimeconfig.cache
E:\Demos\DemoOwns\C\VmianqianC\obj\Debug\net10.0-windows\ref\Vmianqian.dll
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\Vmianqian.exe
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\Vmianqian.deps.json
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\Vmianqian.runtimeconfig.json
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\Vmianqian.dll
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\Vmianqian.pdb
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\AntdUI.dll
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\BouncyCastle.Cryptography.dll
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\MailKit.dll
E:\Demos\DemoOwns\C\VmianqianC\bin_temp\MimeKit.dll
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\BouncyCastle.Cryptography.dll
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\MailKit.dll
E:\Demos\DemoOwns\C\VmianqianC\bin\Debug\net10.0-windows\MimeKit.dll

View File

@ -1 +1 @@
06af8958efc8199d17b3e5352714ede4c860a98abdd43801bf6807d2659e5f95 bfd4fda30425a127e04d84d69f89302f1a5d0a22c65f909e0dc14e06f1be3226

View File

@ -1,23 +1,23 @@
{ {
"format": 1, "format": 1,
"restore": { "restore": {
"E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj": {} "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj": {}
}, },
"projects": { "projects": {
"E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj": { "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj": {
"version": "1.0.0", "version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj", "projectUniqueName": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj",
"projectName": "Vmianqian", "projectName": "Vmianqian",
"projectPath": "E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj", "projectPath": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj",
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\", "packagesPath": "C:\\Users\\heros\\.nuget\\packages\\",
"outputPath": "E:\\Demo\\C\\Vmianqian\\obj\\", "outputPath": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\obj\\",
"projectStyle": "PackageReference", "projectStyle": "PackageReference",
"fallbackFolders": [ "fallbackFolders": [
"C:\\Softwares\\Microsoft Visual Studio\\Shared\\NuGetPackages" "D:\\Softwares\\Microsoft\\VisualStudio\\Shared\\NuGetPackages"
], ],
"configFilePaths": [ "configFilePaths": [
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Users\\heros\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
], ],
@ -26,12 +26,10 @@
], ],
"sources": { "sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {} "https://api.nuget.org/v3/index.json": {}
}, },
"frameworks": { "frameworks": {
"net10.0-windows": { "net10.0-windows7.0": {
"framework": "net10.0-windows7.0",
"targetAlias": "net10.0-windows", "targetAlias": "net10.0-windows",
"projectReferences": {} "projectReferences": {}
} }
@ -49,13 +47,16 @@
"SdkAnalysisLevel": "10.0.200" "SdkAnalysisLevel": "10.0.200"
}, },
"frameworks": { "frameworks": {
"net10.0-windows": { "net10.0-windows7.0": {
"framework": "net10.0-windows7.0",
"targetAlias": "net10.0-windows", "targetAlias": "net10.0-windows",
"dependencies": { "dependencies": {
"AntdUI": { "AntdUI": {
"target": "Package", "target": "Package",
"version": "[2.3.10, )" "version": "[2.3.10, )"
},
"MailKit": {
"target": "Package",
"version": "[4.16.0, )"
} }
}, },
"imports": [ "imports": [
@ -77,7 +78,7 @@
"privateAssets": "none" "privateAssets": "none"
} }
}, },
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.202/PortableRuntimeIdentifierGraph.json", "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json",
"packagesToPrune": { "packagesToPrune": {
"Microsoft.CSharp": "(,4.7.32767]", "Microsoft.CSharp": "(,4.7.32767]",
"Microsoft.VisualBasic": "(,10.4.32767]", "Microsoft.VisualBasic": "(,10.4.32767]",

View File

@ -5,12 +5,12 @@
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool> <RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile> <ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot> <NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\Administrator\.nuget\packages\;C:\Softwares\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders> <NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\heros\.nuget\packages\;D:\Softwares\Microsoft\VisualStudio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle> <NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion> <NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">7.0.0</NuGetToolVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' "> <ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\Administrator\.nuget\packages\" /> <SourceRoot Include="C:\Users\heros\.nuget\packages\" />
<SourceRoot Include="C:\Softwares\Microsoft Visual Studio\Shared\NuGetPackages\" /> <SourceRoot Include="D:\Softwares\Microsoft\VisualStudio\Shared\NuGetPackages\" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -17,6 +17,51 @@
"frameworkReferences": [ "frameworkReferences": [
"Microsoft.WindowsDesktop.App.WindowsForms" "Microsoft.WindowsDesktop.App.WindowsForms"
] ]
},
"BouncyCastle.Cryptography/2.6.2": {
"type": "package",
"compile": {
"lib/net6.0/BouncyCastle.Cryptography.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/BouncyCastle.Cryptography.dll": {
"related": ".xml"
}
}
},
"MailKit/4.16.0": {
"type": "package",
"dependencies": {
"MimeKit": "4.16.0"
},
"compile": {
"lib/net10.0/MailKit.dll": {
"related": ".dll.config;.pdb;.xml"
}
},
"runtime": {
"lib/net10.0/MailKit.dll": {
"related": ".dll.config;.pdb;.xml"
}
}
},
"MimeKit/4.16.0": {
"type": "package",
"dependencies": {
"BouncyCastle.Cryptography": "2.6.2"
},
"compile": {
"lib/net10.0/MimeKit.dll": {
"related": ".dll.config;.pdb;.xml"
}
},
"runtime": {
"lib/net10.0/MimeKit.dll": {
"related": ".dll.config;.pdb;.xml"
}
}
} }
} }
}, },
@ -47,31 +92,135 @@
"lib/net9.0-windows7.0/AntdUI.xml", "lib/net9.0-windows7.0/AntdUI.xml",
"logo.png" "logo.png"
] ]
},
"BouncyCastle.Cryptography/2.6.2": {
"sha512": "7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==",
"type": "package",
"path": "bouncycastle.cryptography/2.6.2",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"bouncycastle.cryptography.2.6.2.nupkg.sha512",
"bouncycastle.cryptography.nuspec",
"lib/net461/BouncyCastle.Cryptography.dll",
"lib/net461/BouncyCastle.Cryptography.xml",
"lib/net6.0/BouncyCastle.Cryptography.dll",
"lib/net6.0/BouncyCastle.Cryptography.xml",
"lib/netstandard2.0/BouncyCastle.Cryptography.dll",
"lib/netstandard2.0/BouncyCastle.Cryptography.xml",
"packageIcon.png"
]
},
"MailKit/4.16.0": {
"sha512": "trJ82DOpAmo8i1jO1vNE+dGn4mPRyeYfy4swRcAGgMJhPoI1Kohf4OFJJf0+YIj4iUxgxPn8W+ht7e7KiYzSjg==",
"type": "package",
"path": "mailkit/4.16.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"docs/ExchangeOAuth2.md",
"docs/FAQ.md",
"docs/GMailOAuth2.md",
"docs/README.md",
"icons/mailkit-50.png",
"lib/net10.0/MailKit.dll",
"lib/net10.0/MailKit.dll.config",
"lib/net10.0/MailKit.pdb",
"lib/net10.0/MailKit.xml",
"lib/net462/MailKit.dll",
"lib/net462/MailKit.dll.config",
"lib/net462/MailKit.pdb",
"lib/net462/MailKit.xml",
"lib/net47/MailKit.dll",
"lib/net47/MailKit.dll.config",
"lib/net47/MailKit.pdb",
"lib/net47/MailKit.xml",
"lib/net48/MailKit.dll",
"lib/net48/MailKit.dll.config",
"lib/net48/MailKit.pdb",
"lib/net48/MailKit.xml",
"lib/net8.0/MailKit.dll",
"lib/net8.0/MailKit.dll.config",
"lib/net8.0/MailKit.pdb",
"lib/net8.0/MailKit.xml",
"lib/netstandard2.0/MailKit.dll",
"lib/netstandard2.0/MailKit.dll.config",
"lib/netstandard2.0/MailKit.pdb",
"lib/netstandard2.0/MailKit.xml",
"lib/netstandard2.1/MailKit.dll",
"lib/netstandard2.1/MailKit.dll.config",
"lib/netstandard2.1/MailKit.pdb",
"lib/netstandard2.1/MailKit.xml",
"mailkit.4.16.0.nupkg.sha512",
"mailkit.nuspec"
]
},
"MimeKit/4.16.0": {
"sha512": "X0LFxeM4gPRIhODyY/HYS9b+zRZ7y//v59rFzgS6wLxcPuZThnMtNZHtrr0fjLyRRkg3gqJBtvW36XfUzZ7Djw==",
"type": "package",
"path": "mimekit/4.16.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"docs/FAQ.md",
"docs/README.md",
"icons/mimekit-50.png",
"lib/net10.0/MimeKit.dll",
"lib/net10.0/MimeKit.dll.config",
"lib/net10.0/MimeKit.pdb",
"lib/net10.0/MimeKit.xml",
"lib/net462/MimeKit.dll",
"lib/net462/MimeKit.pdb",
"lib/net462/MimeKit.xml",
"lib/net47/MimeKit.dll",
"lib/net47/MimeKit.pdb",
"lib/net47/MimeKit.xml",
"lib/net48/MimeKit.dll",
"lib/net48/MimeKit.pdb",
"lib/net48/MimeKit.xml",
"lib/net8.0/MimeKit.dll",
"lib/net8.0/MimeKit.dll.config",
"lib/net8.0/MimeKit.pdb",
"lib/net8.0/MimeKit.xml",
"lib/netstandard2.0/MimeKit.dll",
"lib/netstandard2.0/MimeKit.dll.config",
"lib/netstandard2.0/MimeKit.pdb",
"lib/netstandard2.0/MimeKit.xml",
"lib/netstandard2.1/MimeKit.dll",
"lib/netstandard2.1/MimeKit.dll.config",
"lib/netstandard2.1/MimeKit.pdb",
"lib/netstandard2.1/MimeKit.xml",
"mimekit.4.16.0.nupkg.sha512",
"mimekit.nuspec"
]
} }
}, },
"projectFileDependencyGroups": { "projectFileDependencyGroups": {
"net10.0-windows7.0": [ "net10.0-windows7.0": [
"AntdUI >= 2.3.10" "AntdUI >= 2.3.10",
"MailKit >= 4.16.0"
] ]
}, },
"packageFolders": { "packageFolders": {
"C:\\Users\\Administrator\\.nuget\\packages\\": {}, "C:\\Users\\heros\\.nuget\\packages\\": {},
"C:\\Softwares\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} "D:\\Softwares\\Microsoft\\VisualStudio\\Shared\\NuGetPackages": {}
}, },
"project": { "project": {
"version": "1.0.0", "version": "1.0.0",
"restore": { "restore": {
"projectUniqueName": "E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj", "projectUniqueName": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj",
"projectName": "Vmianqian", "projectName": "Vmianqian",
"projectPath": "E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj", "projectPath": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj",
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\", "packagesPath": "C:\\Users\\heros\\.nuget\\packages\\",
"outputPath": "E:\\Demo\\C\\Vmianqian\\obj\\", "outputPath": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\obj\\",
"projectStyle": "PackageReference", "projectStyle": "PackageReference",
"fallbackFolders": [ "fallbackFolders": [
"C:\\Softwares\\Microsoft Visual Studio\\Shared\\NuGetPackages" "D:\\Softwares\\Microsoft\\VisualStudio\\Shared\\NuGetPackages"
], ],
"configFilePaths": [ "configFilePaths": [
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Users\\heros\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
], ],
@ -80,7 +229,6 @@
], ],
"sources": { "sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {} "https://api.nuget.org/v3/index.json": {}
}, },
"frameworks": { "frameworks": {
@ -108,6 +256,10 @@
"AntdUI": { "AntdUI": {
"target": "Package", "target": "Package",
"version": "[2.3.10, )" "version": "[2.3.10, )"
},
"MailKit": {
"target": "Package",
"version": "[4.16.0, )"
} }
}, },
"imports": [ "imports": [
@ -129,7 +281,7 @@
"privateAssets": "none" "privateAssets": "none"
} }
}, },
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.202/PortableRuntimeIdentifierGraph.json", "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.201/PortableRuntimeIdentifierGraph.json",
"packagesToPrune": { "packagesToPrune": {
"Microsoft.CSharp": "(,4.7.32767]", "Microsoft.CSharp": "(,4.7.32767]",
"Microsoft.VisualBasic": "(,10.4.32767]", "Microsoft.VisualBasic": "(,10.4.32767]",

View File

@ -1,10 +1,13 @@
{ {
"version": 2, "version": 2,
"dgSpecHash": "qbBH41KABjc=", "dgSpecHash": "JL2C2PQV5/Y=",
"success": true, "success": true,
"projectFilePath": "E:\\Demo\\C\\Vmianqian\\Vmianqian.csproj", "projectFilePath": "E:\\Demos\\DemoOwns\\C\\VmianqianC\\Vmianqian.csproj",
"expectedPackageFiles": [ "expectedPackageFiles": [
"C:\\Users\\Administrator\\.nuget\\packages\\antdui\\2.3.10\\antdui.2.3.10.nupkg.sha512" "C:\\Users\\heros\\.nuget\\packages\\antdui\\2.3.10\\antdui.2.3.10.nupkg.sha512",
"C:\\Users\\heros\\.nuget\\packages\\bouncycastle.cryptography\\2.6.2\\bouncycastle.cryptography.2.6.2.nupkg.sha512",
"C:\\Users\\heros\\.nuget\\packages\\mailkit\\4.16.0\\mailkit.4.16.0.nupkg.sha512",
"C:\\Users\\heros\\.nuget\\packages\\mimekit\\4.16.0\\mimekit.4.16.0.nupkg.sha512"
], ],
"logs": [] "logs": []
} }