From a1301ee8ce8ba3657c052186074af8df0d12a74a Mon Sep 17 00:00:00 2001 From: liang123456a Date: Thu, 4 Sep 2025 11:25:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WinFormsApp1.sln | 25 ++ WinFormsApp1/FastDataGridView.cs | 18 ++ WinFormsApp1/Form1.Designer.cs | 202 ++++++++++++++++ WinFormsApp1/Form1.cs | 386 +++++++++++++++++++++++++++++++ WinFormsApp1/Form1.resx | 126 ++++++++++ WinFormsApp1/Program.cs | 19 ++ WinFormsApp1/WinFormsApp1.csproj | 11 + 7 files changed, 787 insertions(+) create mode 100644 WinFormsApp1.sln create mode 100644 WinFormsApp1/FastDataGridView.cs create mode 100644 WinFormsApp1/Form1.Designer.cs create mode 100644 WinFormsApp1/Form1.cs create mode 100644 WinFormsApp1/Form1.resx create mode 100644 WinFormsApp1/Program.cs create mode 100644 WinFormsApp1/WinFormsApp1.csproj diff --git a/WinFormsApp1.sln b/WinFormsApp1.sln new file mode 100644 index 0000000..39f2d03 --- /dev/null +++ b/WinFormsApp1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36414.22 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsApp1", "WinFormsApp1\WinFormsApp1.csproj", "{0381403B-467B-4EF5-88B1-C81DC8C5F72C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0381403B-467B-4EF5-88B1-C81DC8C5F72C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0381403B-467B-4EF5-88B1-C81DC8C5F72C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0381403B-467B-4EF5-88B1-C81DC8C5F72C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0381403B-467B-4EF5-88B1-C81DC8C5F72C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8AF56E48-64A8-47EF-8B64-B63116FF7585} + EndGlobalSection +EndGlobal diff --git a/WinFormsApp1/FastDataGridView.cs b/WinFormsApp1/FastDataGridView.cs new file mode 100644 index 0000000..a87c887 --- /dev/null +++ b/WinFormsApp1/FastDataGridView.cs @@ -0,0 +1,18 @@ +using System; +using System.Reflection; +using System.Windows.Forms; + +public class FastDataGridView : DataGridView +{ + public FastDataGridView() + { + // 通过反射开启 DataGridView 的 DoubleBuffered 属性 + typeof(DataGridView) + .GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic) + .SetValue(this, true, null); + + this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); + this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); + this.SetStyle(ControlStyles.UserPaint, true); + } +} diff --git a/WinFormsApp1/Form1.Designer.cs b/WinFormsApp1/Form1.Designer.cs new file mode 100644 index 0000000..6cbcaad --- /dev/null +++ b/WinFormsApp1/Form1.Designer.cs @@ -0,0 +1,202 @@ +namespace WinFormDataGridViewDemo +{ + partial class Form1 + { + private System.ComponentModel.IContainer components = null; + private System.Windows.Forms.Button btnCoverRow; + private System.Windows.Forms.Button btnCoverAll; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + btnCoverRow = new Button(); + btnCoverAll = new Button(); + saveBtn = new Button(); + LayoutPath = new TextBox(); + button1 = new Button(); + AlarmPath = new TextBox(); + openFileDialog1 = new OpenFileDialog(); + label1 = new Label(); + panel3 = new Panel(); + progressBar1 = new ProgressBar(); + DiffCountLab = new Label(); + label2 = new Label(); + tableLayoutPanel1 = new TableLayoutPanel(); + dataGridView1 = new DataGridView(); + panel3.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); + SuspendLayout(); + // + // btnCoverRow + // + btnCoverRow.Location = new Point(238, 78); + btnCoverRow.Name = "btnCoverRow"; + btnCoverRow.Size = new Size(90, 30); + btnCoverRow.TabIndex = 1; + btnCoverRow.Text = "覆盖选中行"; + btnCoverRow.UseVisualStyleBackColor = true; + btnCoverRow.Click += btnCoverRow_Click; + // + // btnCoverAll + // + btnCoverAll.Location = new Point(132, 78); + btnCoverAll.Name = "btnCoverAll"; + btnCoverAll.Size = new Size(100, 30); + btnCoverAll.TabIndex = 2; + btnCoverAll.Text = "覆盖全部"; + btnCoverAll.UseVisualStyleBackColor = true; + btnCoverAll.Click += btnCoverAll_Click; + // + // saveBtn + // + saveBtn.Location = new Point(329, 43); + saveBtn.Name = "saveBtn"; + saveBtn.Size = new Size(102, 30); + saveBtn.TabIndex = 4; + saveBtn.Text = "保存"; + saveBtn.UseVisualStyleBackColor = true; + saveBtn.Click += SaveAlarm; + // + // LayoutPath + // + LayoutPath.Location = new Point(125, 9); + LayoutPath.Name = "LayoutPath"; + LayoutPath.Size = new Size(198, 27); + LayoutPath.TabIndex = 6; + LayoutPath.Click += OpenLayoutXml_Click; + // + // button1 + // + button1.Location = new Point(329, 7); + button1.Name = "button1"; + button1.Size = new Size(102, 30); + button1.TabIndex = 5; + button1.Text = "重新加载"; + button1.UseVisualStyleBackColor = true; + button1.Click += reloadXml; + // + // AlarmPath + // + AlarmPath.Location = new Point(125, 42); + AlarmPath.Name = "AlarmPath"; + AlarmPath.Size = new Size(198, 27); + AlarmPath.TabIndex = 8; + AlarmPath.Click += SecsAlarm_Click; + // + // openFileDialog1 + // + openFileDialog1.FileName = "openFileDialog1"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(16, 13); + label1.Name = "label1"; + label1.Size = new Size(101, 20); + label1.TabIndex = 9; + label1.Text = "LayoutAlarm"; + // + // panel3 + // + panel3.Controls.Add(progressBar1); + panel3.Controls.Add(DiffCountLab); + panel3.Controls.Add(btnCoverAll); + panel3.Controls.Add(btnCoverRow); + panel3.Controls.Add(button1); + panel3.Controls.Add(saveBtn); + panel3.Controls.Add(label2); + panel3.Controls.Add(LayoutPath); + panel3.Controls.Add(label1); + panel3.Controls.Add(AlarmPath); + panel3.Location = new Point(3, 3); + panel3.Name = "panel3"; + panel3.Size = new Size(760, 111); + panel3.TabIndex = 10; + // + // progressBar1 + // + progressBar1.Location = new Point(16, 81); + progressBar1.Name = "progressBar1"; + progressBar1.Size = new Size(110, 24); + progressBar1.TabIndex = 12; + // + // DiffCountLab + // + DiffCountLab.AutoSize = true; + DiffCountLab.Location = new Point(334, 83); + DiffCountLab.Name = "DiffCountLab"; + DiffCountLab.Size = new Size(84, 20); + DiffCountLab.TabIndex = 11; + DiffCountLab.Text = "差异行数:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(3, 43); + label2.Name = "label2"; + label2.Size = new Size(116, 20); + label2.TabIndex = 10; + label2.Text = "SECSAlarmXml"; + // + // tableLayoutPanel1 + // + tableLayoutPanel1.AutoSize = true; + tableLayoutPanel1.ColumnCount = 1; + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F)); + tableLayoutPanel1.Controls.Add(panel3, 0, 0); + tableLayoutPanel1.Controls.Add(dataGridView1, 0, 1); + tableLayoutPanel1.Location = new Point(22, 12); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 2; + tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 19.0031147F)); + tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, 80.99689F)); + tableLayoutPanel1.Size = new Size(816, 617); + tableLayoutPanel1.TabIndex = 12; + // + // dataGridView1 + // + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.Location = new Point(3, 120); + dataGridView1.Name = "dataGridView1"; + dataGridView1.RowHeadersWidth = 51; + dataGridView1.Size = new Size(810, 478); + dataGridView1.TabIndex = 3; + // + // Form1 + // + ClientSize = new Size(1454, 634); + Controls.Add(tableLayoutPanel1); + Name = "Form1"; + Text = "AlarmDiff"; + panel3.ResumeLayout(false); + panel3.PerformLayout(); + tableLayoutPanel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + private Button saveBtn; + private DataGridView dataGridView1; + private Button button1; + private OpenFileDialog openFileDialog1; + private TextBox LayoutPath; + private TextBox AlarmPath; + private Label label1; + private Panel panel3; + private Label label2; + private Panel panel1; + private TableLayoutPanel tableLayoutPanel1; + private Label DiffCountLab; + private ProgressBar progressBar1; + } +} diff --git a/WinFormsApp1/Form1.cs b/WinFormsApp1/Form1.cs new file mode 100644 index 0000000..2642767 --- /dev/null +++ b/WinFormsApp1/Form1.cs @@ -0,0 +1,386 @@ +using System; +using System.Data; +using System.Data.SqlTypes; +using System.Reflection; +using System.Windows.Forms; +using System.Xml; + +namespace WinFormDataGridViewDemo +{ + public partial class Form1 : Form + { + private static Boolean SaveFlag = true; + private int diffcount = 0; + //ʼ + public Form1() + { + + InitializeComponent(); + + // ʼ DataGridView + dataGridView1.ColumnCount = 4; + dataGridView1.Columns[0].Name = "LayoutKey"; + dataGridView1.Columns[1].Name = "LayoutValue"; + dataGridView1.Columns[2].Name = "SecsKey"; + dataGridView1.Columns[3].Name = "SecsValue"; + dataGridView1.Columns[0].ReadOnly = true; + dataGridView1.Columns[1].ReadOnly = true; + dataGridView1.Columns[2].ReadOnly = true; + dataGridView1.Columns[3].ReadOnly = false; + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; + dataGridView1.AllowUserToAddRows = false; + LoadDataGrid(); + dataGridView1.Dock = DockStyle.Fill; + tableLayoutPanel1.Dock = DockStyle.Fill; + dataGridView1.RowPostPaint += dataGridView1_RowPostPaint; + dataGridView1.CellFormatting += dataGridView1_CellFormatting; + dataGridView1.AllowUserToAddRows = false; + //dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = System.Drawing.Color.LightGray; + + int w = 0; + foreach (DataGridViewColumn item in dataGridView1.Columns) + { + w += item.Width; + } + dataGridView1.Width = w; + + int borderWidth = this.Width - this.ClientSize.Width; + this.Width = dataGridView1.Width + borderWidth + 200; + } + // + private void LoadDataGrid() + { + SaveFlag = true; + var alramLayout = @"D:\iWISEETEC\ABN12\\AlarmLayout_Eng.xml"; + var alramSecsXml = @"D:\iWISEETEC\WSecsAgent\\SecsPar\\config\\yui.xml"; + if (!string.Empty.Equals(LayoutPath.Text)) + { + alramLayout = LayoutPath.Text; + } + if (!string.Empty.Equals(AlarmPath.Text)) + { + alramSecsXml = AlarmPath.Text; + } + var layoutResult = LoadAlarmLayoutXML(alramLayout); + var secsResult = LoadAlarmSecsXML(alramSecsXml, out XmlDocument doc); + + dataGridView1.Rows.Clear(); + + var mergedList = layoutResult.Select(kv => new + { + LayoutKey = kv.Key, + LayoutValue = kv.Value, + SecsKey = kv.Key, + SecsValue = secsResult.ContainsKey(kv.Key) ? secsResult[kv.Key] : "" + }).ToList(); + + foreach (var item in mergedList) + { + dataGridView1.Rows.Add(item.LayoutKey, item.LayoutValue, item.SecsKey, item.SecsValue); + } + diffcount = 0; + UpdateDiffCount(); + + } + + // ѡ + private void btnCoverRow_Click(object sender, EventArgs e) + { + foreach (DataGridViewRow row in dataGridView1.SelectedRows) + { + if (row.IsNewRow) continue; + var name = row.Cells[1].Value?.ToString(); + row.Cells[3].Value = name; + } + if (dataGridView1.CurrentRow != null) + { + var rowIndex = dataGridView1.CurrentRow.Index; + var code = dataGridView1.Rows[rowIndex].Cells[0].Value?.ToString(); + var name = dataGridView1.Rows[rowIndex].Cells[1].Value?.ToString(); + + dataGridView1.Rows[rowIndex].Cells[3].Value = name; + SaveFlag = false; + } + + UpdateDiffCount(); + } + + // ȫ + private async void btnCoverAll_Click(object sender, EventArgs e) + { + var rowCount = dataGridView1.Rows.Count; + Cursor = Cursors.WaitCursor; + //progressBar1.Minimum = 0; + panel3.Enabled = false; + progressBar1.Value = 0; + progressBar1.Maximum = diffcount; + progressBar1.Visible = true; + var index = 0; + await Task.Run(() => + { + foreach (DataGridViewRow row in dataGridView1.Rows) + { + var leftValue = row.Cells[1].Value.ToString(); + if ("" == leftValue) + { + continue; + } + var rightValue = row.Cells[3].Value.ToString(); + if (leftValue == rightValue) + { + continue; + } + Invoke(() => + { + index++; + return row.Cells[3].Value = leftValue; + }); + + SaveFlag = false; + + Invoke(() => { + progressBar1.Value += 1; + }); + } + diffcount -= index; + Invoke(SetDiffCountText); + }); + progressBar1.Value = 0; + panel3.Enabled = true; + this.Cursor = Cursors.Default; + MessageBox.Show($"Ѹ {index} ,桿дXML"); + + } + + //к + private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) + { + string rowNumber = (e.RowIndex + 1).ToString(); + + var headerBounds = new Rectangle( + e.RowBounds.Left, + e.RowBounds.Top, + dataGridView1.RowHeadersWidth, + e.RowBounds.Height); + + TextRenderer.DrawText( + e.Graphics, + rowNumber, + dataGridView1.Font, + headerBounds, + SystemColors.ControlText, + TextFormatFlags.VerticalCenter | TextFormatFlags.Right + ); + } + // + private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) + { + if (e.ColumnIndex == 3 && e.RowIndex >= 0) + { + if (dataGridView1.Rows[e.RowIndex].Cells[1].Value?.ToString() != dataGridView1.Rows[e.RowIndex].Cells[3].Value?.ToString()) + { + //dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.FromArgb(255, 182, 193); + dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.FromArgb(255, 200, 200); + dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.White; + } + else + { + dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = dataGridView1.DefaultCellStyle.BackColor; + dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = dataGridView1.DefaultCellStyle.ForeColor; + } + + } + + } + //ͳƲ + private void UpdateDiffCount() + { + if (diffcount != 0) diffcount = 0; + var map = new Dictionary(); + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (row.IsNewRow) continue; + + if (!(row.Cells[1].Value.ToString() == row.Cells[3].Value?.ToString())) + { + diffcount++; + } + } + SetDiffCountText(); + } + // + private void SaveAlarm(object sender, EventArgs e) + { + if (SaveFlag) + { + MessageBox.Show("δ޸豣!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return; + } + string alramSecsXml = @"D:\iWISEETEC\WSecsAgent\SecsPar\config\yui.xml"; + + if (!File.Exists(alramSecsXml)) + { + MessageBox.Show("Secs XML ļڣ"); + return; + } + + XmlDocument doc = new XmlDocument(); + doc.Load(alramSecsXml); + + XmlNode root = doc.DocumentElement; + if (root == null) + { + MessageBox.Show("XML ڵ㲻ڣ"); + return; + } + + XmlNodeList nodes = doc.SelectNodes("//Item"); + Dictionary nodeDict = new Dictionary(); + + if (nodes != null) + { + foreach (XmlNode node in nodes) + { + if (node.Attributes?["Code"] != null && + int.TryParse(node.Attributes["Code"].Value, out int code)) + { + nodeDict[code] = node; + } + } + } + + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (row.IsNewRow) continue; + + if (int.TryParse(row.Cells[2].Value?.ToString(), out int key)) + { + string newValue = row.Cells[3].Value?.ToString() ?? ""; + + if (nodeDict.ContainsKey(key)) + { + // ޸ + nodeDict[key].Attributes["Name"].Value = newValue; + //Descriptionܲ + if (nodeDict[key].Attributes["Description"] != null) + { + nodeDict[key].Attributes["Description"].Value = newValue; + + } + + } + else + { + // + XmlElement newNode = doc.CreateElement("Item"); + XmlAttribute codeAttr = doc.CreateAttribute("Code"); + XmlAttribute UnitAttr = doc.CreateAttribute("Unit"); + XmlAttribute LevelAttr = doc.CreateAttribute("Level"); + XmlAttribute nameAttr = doc.CreateAttribute("Name"); + XmlAttribute descriptionAttr = doc.CreateAttribute("Description"); + XmlAttribute HowToAttr = doc.CreateAttribute("HowTo"); + + codeAttr.Value = key.ToString(); + UnitAttr.Value = "00"; + LevelAttr.Value = "W"; + nameAttr.Value = newValue; + descriptionAttr.Value = newValue; + HowToAttr.Value = ""; + + newNode.Attributes.Append(codeAttr); + newNode.Attributes.Append(UnitAttr); + newNode.Attributes.Append(LevelAttr); + newNode.Attributes.Append(nameAttr); + newNode.Attributes.Append(descriptionAttr); + newNode.Attributes.Append(HowToAttr); + + root.AppendChild(newNode); + } + } + } + + doc.Save(alramSecsXml); + MessageBox.Show("ɹ"); + LoadDataGrid(); + } + //xml + private Dictionary LoadAlarmLayoutXML(string path) + { + Dictionary result = new Dictionary(); + string xmlContent = File.ReadAllText(path); + XmlDocument doc = new XmlDocument(); + doc.LoadXml(xmlContent); + + XmlNodeList nodes = doc.SelectNodes("//wAlarmLayout"); + foreach (XmlNode node in nodes) + { + int erCode = int.Parse(node["erCode"].InnerText); + string msg = node["Msg"]?.InnerText ?? ""; + + result[erCode] = msg; + + } + return result; + } + //xml + private Dictionary LoadAlarmSecsXML(string path, out XmlDocument doc) + { + var result = new Dictionary(); + doc = new XmlDocument(); + + doc.Load(path); + + XmlNodeList nodes = doc.SelectNodes("//Item"); + if (nodes == null) return result; + + foreach (XmlNode node in nodes) + { + if (node.Attributes == null) continue; + + string codeStr = node.Attributes["Code"]?.Value; + string name = node.Attributes["Name"]?.Value ?? ""; + + if (int.TryParse(codeStr, out int code)) + { + result[code] = name; + } + } + + return result; + } + // reloadXml + private void reloadXml(object sender, EventArgs e) + { + LoadDataGrid(); + MessageBox.Show($"¼سɹ", "Information", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + + } + //LayoutXml· + private void OpenLayoutXml_Click(object sender, EventArgs e) + { + if (this.openFileDialog1.ShowDialog() == DialogResult.OK) + { + this.LayoutPath.Text = this.openFileDialog1.FileName; + LoadDataGrid(); + } + + } + //SecsAlarm· + private void SecsAlarm_Click(object sender, EventArgs e) + { + if (this.openFileDialog1.ShowDialog() == DialogResult.OK) + { + this.AlarmPath.Text = this.openFileDialog1.FileName; + LoadDataGrid(); + } + } + //lab + private void SetDiffCountText() + { + this.DiffCountLab.Text = $":{diffcount}"; + } + //¼ + + + } +} diff --git a/WinFormsApp1/Form1.resx b/WinFormsApp1/Form1.resx new file mode 100644 index 0000000..7d8924b --- /dev/null +++ b/WinFormsApp1/Form1.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 7 + + + 52 + + \ No newline at end of file diff --git a/WinFormsApp1/Program.cs b/WinFormsApp1/Program.cs new file mode 100644 index 0000000..e2505d5 --- /dev/null +++ b/WinFormsApp1/Program.cs @@ -0,0 +1,19 @@ +using WinFormDataGridViewDemo; + +namespace WinFormsApp1 +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Form1()); + } + } +} \ No newline at end of file diff --git a/WinFormsApp1/WinFormsApp1.csproj b/WinFormsApp1/WinFormsApp1.csproj new file mode 100644 index 0000000..663fdb8 --- /dev/null +++ b/WinFormsApp1/WinFormsApp1.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net8.0-windows + enable + true + enable + + + \ No newline at end of file