更新工具首次上传

This commit is contained in:
hontbei 2025-08-11 19:02:24 +08:00
commit d498346d2f
305 changed files with 9530 additions and 0 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,258 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\mainwindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\mainwindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\scpuploadservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\scpuploadservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\mainwindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\mainwindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\sshuploadhotupdate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\sshuploadhotupdate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\appsettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\appsettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\mainwindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\mainwindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\progresswindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\progresswindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\messagedialogviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\messagedialogviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\messagedialog.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\messagedialog.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\messagedialog.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\messagedialog.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\viewmodelbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\viewmodelbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\progresswindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\progresswindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\progresswindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\progresswindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewlocator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewlocator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "MainWindow.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"ViewState": "AgIAAO8BAAAAAAAAAAAAAAUCAAAvAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:00:38.514Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "MainWindow.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MainWindow.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MainWindow.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T09:59:59.584Z"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "ScpUploadService.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\ScpUploadService.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\ScpUploadService.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\ScpUploadService.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\ScpUploadService.cs",
"ViewState": "AgIAAAsAAAAAAAAAAAAYwBIAAAAjAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-23T07:53:20.215Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "SshUploadHotUpdate.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"ViewState": "AgIAABAAAAAAAAAAAAAAwAwAAAA4AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-23T10:44:47.069Z"
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "MessageDialog.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MessageDialog.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MessageDialog.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T11:19:27.452Z"
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "MainWindowViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"ViewState": "AgIAADMAAAAAAAAAAAAowD0AAAA1AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T09:59:57.624Z"
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "AppSettings.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\AppSettings.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\AppSettings.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\AppSettings.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\AppSettings.cs",
"ViewState": "AgIAAAEAAAAAAAAAAAAkwAkAAAAWAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-24T03:13:05.123Z"
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "MessageDialogViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABgAAAAOAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T11:20:47.127Z"
},
{
"$type": "Document",
"DocumentIndex": 12,
"Title": "ProgressWindow.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:21:04.512Z"
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "MessageDialog.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"ViewState": "AgIAAAMAAAAAAAAAAADwvw8AAAAPAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T11:20:25.88Z"
},
{
"$type": "Document",
"DocumentIndex": 10,
"Title": "Program.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Program.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Program.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Program.cs",
"RelativeToolTip": "AvaloniaApplication2\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAAAyAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-10T01:37:29.102Z"
},
{
"$type": "Document",
"DocumentIndex": 14,
"Title": "ViewLocator.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewLocator.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewLocator.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewLocator.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewLocator.cs",
"ViewState": "AgIAAAMAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-20T02:13:30.213Z"
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "ProgressWindowViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"ViewState": "AgIAAC0AAAAAAAAAAAAAwDoAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:20:34.038Z"
},
{
"$type": "Document",
"DocumentIndex": 13,
"Title": "ProgressWindow.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T10:19:24.32Z"
},
{
"$type": "Document",
"DocumentIndex": 11,
"Title": "ViewModelBase.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAARAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:01:00.378Z"
}
]
}
]
}
]
}

View File

@ -0,0 +1,258 @@
{
"Version": 1,
"WorkspaceRootPath": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\mainwindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\mainwindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\scpuploadservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\scpuploadservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\mainwindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\mainwindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\sshuploadhotupdate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\sshuploadhotupdate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\script\\appsettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\script\\appsettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\mainwindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\mainwindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\progresswindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\progresswindowviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\messagedialogviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\messagedialogviewmodel.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\messagedialog.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\messagedialog.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\messagedialog.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\messagedialog.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewmodels\\viewmodelbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewmodels\\viewmodelbase.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\progresswindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\progresswindow.axaml.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\views\\progresswindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\views\\progresswindow.axaml||{6D5344A2-2FCD-49DE-A09D-6A14FD1B1224}"
},
{
"AbsoluteMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|e:\\workspace\\avaloniaproject\\avaloniaapplication2\\avaloniaapplication2\\viewlocator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{C979B63A-90CC-452F-81CC-6917062EF33D}|AvaloniaApplication2\\AvaloniaApplication2.csproj|solutionrelative:avaloniaapplication2\\viewlocator.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 0,
"Children": [
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "MainWindow.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MainWindow.axaml.cs",
"ViewState": "AgIAAOkBAAAAAAAAAAAAAP4BAAAUAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:00:38.514Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "MainWindow.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MainWindow.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MainWindow.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MainWindow.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T09:59:59.584Z"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "ScpUploadService.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\ScpUploadService.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\ScpUploadService.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\ScpUploadService.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\ScpUploadService.cs",
"ViewState": "AgIAAAsAAAAAAAAAAAAYwBIAAAAjAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-23T07:53:20.215Z"
},
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "SshUploadHotUpdate.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\SshUploadHotUpdate.cs",
"ViewState": "AgIAABAAAAAAAAAAAAAAwAwAAAA4AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-23T10:44:47.069Z"
},
{
"$type": "Document",
"DocumentIndex": 8,
"Title": "MessageDialog.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MessageDialog.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MessageDialog.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T11:19:27.452Z"
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "MainWindowViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\MainWindowViewModel.cs",
"ViewState": "AgIAADMAAAAAAAAAAAAowD0AAAA1AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T09:59:57.624Z"
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "AppSettings.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\AppSettings.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Script\\AppSettings.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Script\\AppSettings.cs",
"RelativeToolTip": "AvaloniaApplication2\\Script\\AppSettings.cs",
"ViewState": "AgIAAAEAAAAAAAAAAAAkwAkAAAAWAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-24T03:13:05.123Z"
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "MessageDialogViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\MessageDialogViewModel.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABgAAAAOAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T11:20:47.127Z"
},
{
"$type": "Document",
"DocumentIndex": 12,
"Title": "ProgressWindow.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\ProgressWindow.axaml.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:21:04.512Z"
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "MessageDialog.axaml.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"RelativeToolTip": "AvaloniaApplication2\\Views\\MessageDialog.axaml.cs",
"ViewState": "AgIAAAMAAAAAAAAAAADwvw8AAAAPAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T11:20:25.88Z"
},
{
"$type": "Document",
"DocumentIndex": 10,
"Title": "Program.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Program.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Program.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Program.cs",
"RelativeToolTip": "AvaloniaApplication2\\Program.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABAAAAAyAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-10T01:37:29.102Z"
},
{
"$type": "Document",
"DocumentIndex": 14,
"Title": "ViewLocator.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewLocator.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewLocator.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewLocator.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewLocator.cs",
"ViewState": "AgIAAAMAAAAAAAAAAADwvwAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-20T02:13:30.213Z"
},
{
"$type": "Document",
"DocumentIndex": 6,
"Title": "ProgressWindowViewModel.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\ProgressWindowViewModel.cs",
"ViewState": "AgIAAC0AAAAAAAAAAAAAwDoAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:20:34.038Z"
},
{
"$type": "Document",
"DocumentIndex": 13,
"Title": "ProgressWindow.axaml",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"RelativeDocumentMoniker": "AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"RelativeToolTip": "AvaloniaApplication2\\Views\\ProgressWindow.axaml",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003549|",
"WhenOpened": "2025-04-09T10:19:24.32Z"
},
{
"$type": "Document",
"DocumentIndex": 11,
"Title": "ViewModelBase.cs",
"DocumentMoniker": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"RelativeDocumentMoniker": "AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"ToolTip": "E:\\WorkSpace\\AvaloniaProject\\AvaloniaApplication2\\AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"RelativeToolTip": "AvaloniaApplication2\\ViewModels\\ViewModelBase.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAARAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-04-09T10:01:00.378Z"
}
]
}
]
}
]
}

24
AvaloniaApplication2.sln Normal file
View File

@ -0,0 +1,24 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35919.96
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AvaloniaApplication2", "AvaloniaApplication2\AvaloniaApplication2.csproj", "{C979B63A-90CC-452F-81CC-6917062EF33D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C979B63A-90CC-452F-81CC-6917062EF33D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C979B63A-90CC-452F-81CC-6917062EF33D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C979B63A-90CC-452F-81CC-6917062EF33D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C979B63A-90CC-452F-81CC-6917062EF33D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F94B862B-3976-4EFE-B05F-14412E63AC6E}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,2 @@
AccessKey ID,AccessKey Secret
LTAI5tNwqEoUk4xhmih23N1H,j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu
1 AccessKey ID AccessKey Secret
2 LTAI5tNwqEoUk4xhmih23N1H j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu

View File

@ -0,0 +1,15 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaApplication2.App"
xmlns:local="using:AvaloniaApplication2"
RequestedThemeVariant="Default">
<!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->
<Application.DataTemplates>
<local:ViewLocator/>
</Application.DataTemplates>
<Application.Styles>
<FluentTheme />
</Application.Styles>
</Application>

View File

@ -0,0 +1,30 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using AvaloniaApplication2.ViewModels;
using AvaloniaApplication2.Views;
namespace AvaloniaApplication2
{
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow
{
DataContext = new MainWindowViewModel(),
};
}
base.OnFrameworkInitializationCompleted();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@ -0,0 +1,32 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
<ItemGroup>
<Folder Include="Models\" />
<AvaloniaResource Include="Assets\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AlibabaCloud.SDK.Cdn20180510" Version="4.0.0" />
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageReference Include="Avalonia" Version="11.2.6" />
<PackageReference Include="Avalonia.Desktop" Version="11.2.6" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.6" />
<PackageReference Include="Avalonia.Fonts.Inter" Version="11.2.6" />
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Include="Avalonia.Diagnostics" Version="11.2.6">
<IncludeAssets Condition="'$(Configuration)' != 'Debug'">None</IncludeAssets>
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference>
<PackageReference Include="Avalonia.ReactiveUI" Version="11.2.6" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SSH.NET" Version="2025.0.0" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<_LastSelectedProfileId>E:\WorkSpace\AvaloniaProject\AvaloniaApplication2\AvaloniaApplication2\Properties\PublishProfiles\FolderProfile2.pubxml</_LastSelectedProfileId>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,24 @@
using System;
using Avalonia;
using Avalonia.ReactiveUI;
namespace AvaloniaApplication2
{
internal sealed class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.WithInterFont()
.LogToTrace()
.UseReactiveUI();
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>E:\WorkSpace\AvaloniaRelease\MeowMentUpdate(bucketversion)</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
<TargetFramework>net8.0</TargetFramework>
<SelfContained>false</SelfContained>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<History>True|2025-07-24T03:57:32.6651477Z||;True|2025-07-24T11:57:18.0748177+08:00||;True|2025-07-24T11:56:45.8783217+08:00||;True|2025-07-24T11:56:14.3991653+08:00||;True|2025-07-24T11:55:53.7323591+08:00||;True|2025-07-24T11:55:20.3669493+08:00||;True|2025-06-23T19:08:26.4255900+08:00||;True|2025-06-13T11:11:39.1952880+08:00||;True|2025-06-13T11:10:34.8295520+08:00||;True|2025-06-13T11:09:45.8018068+08:00||;True|2025-06-13T11:09:22.8641496+08:00||;True|2025-06-10T11:47:13.2857077+08:00||;True|2025-06-03T17:18:34.9107355+08:00||;True|2025-04-24T11:26:28.3600894+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>E:\WorkSpace\AvaloniaRelease\MeowMentUpdate</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<History>True|2025-06-13T03:12:51.9447288Z||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net8.0\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<_TargetId>Folder</_TargetId>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<History>True|2025-07-24T03:58:23.6484039Z||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -0,0 +1,2 @@
AccessKey ID,AccessKey Secret
LTAI5tNwqEoUk4xhmih23N1H,j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu
1 AccessKey ID AccessKey Secret
2 LTAI5tNwqEoUk4xhmih23N1H j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu

View File

@ -0,0 +1,47 @@
using System;
using System.IO;
using System.Text.Json;
namespace AvaloniaApplication2
{
public class AppSettings
{
public string SelectedBucket { get; set; } = "client";
public string SelectedServer { get; set; }
public string SelectedPath { get; set; }
private static readonly string SettingsPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"AvaloniaApplication2",
"settings.json");
public static AppSettings Load()
{
try
{
if (File.Exists(SettingsPath))
{
var json = File.ReadAllText(SettingsPath);
return JsonSerializer.Deserialize<AppSettings>(json) ?? new AppSettings();
}
}
catch { }
return new AppSettings();
}
public void Save()
{
try
{
var directory = Path.GetDirectoryName(SettingsPath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
var json = JsonSerializer.Serialize(this);
File.WriteAllText(SettingsPath, json);
}
catch { }
}
}
}

View File

@ -0,0 +1,301 @@
using Aliyun.OSS;
using Aliyun.OSS.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reactive.Subjects;
using System.Text.Json.Nodes;
using System.Text.Json;
using System.Threading.Tasks;
namespace AvaloniaApplication2.Script
{
public class ScpUploadService
{
public IObservable<(int progress, string status)> Progress => _progressSubject;
private readonly Subject<(int progress, string status)> _progressSubject = new();
public async Task UploadFolderAsync(string bucketName,
string localFolderPath,
string remoteParentPath)
{
await Task.Run(() =>
{
try
{
// 1. 读取 AccessKey.csv 获取凭证
_progressSubject.OnNext((0, "正在读取阿里云访问凭证..."));
//var (accessKeyId, accessKeySecret) = ReadAccessKey("AccessKey.csv");
var accessKeyId = "LTAI5tNwqEoUk4xhmih23N1H";
var accessKeySecret = "j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu";
// 2. 创建 OSS 客户端
var endpoint = "oss-cn-heyuan.aliyuncs.com"; // 根据实际情况修改
if(bucketName == "merge-pet-us")
{
endpoint = "oss-us-west-1.aliyuncs.com";
}
//var bucketName = bucketName;
var conf = new ClientConfiguration();
conf.SignatureVersion = SignatureVersion.V4; // 使用 V4 签名版本
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret,conf);
if (bucketName == "merge-pet-us")
{
ossClient.SetRegion("us-west-1");
}
else
{
ossClient.SetRegion("cn-heyuan");
}
_progressSubject.OnNext((5, "OSS 客户端创建成功"));
// 3. 验证本地文件夹
if (!Directory.Exists(localFolderPath))
throw new DirectoryNotFoundException($"本地文件夹不存在: {localFolderPath}");
// 4. 准备远程路径
var folderName = Path.GetFileName(localFolderPath.TrimEnd('\\', '/'));
var remoteTargetPath = $"{remoteParentPath.TrimEnd('/')}/{folderName}/";
_progressSubject.OnNext((10, $"准备上传到: {remoteTargetPath}"));
// 5. 获取所有文件
var allFiles = Directory.GetFiles(localFolderPath, "*", SearchOption.AllDirectories).ToList();
int totalFiles = allFiles.Count;
int uploadedFiles = 0;
// 6. 上传所有文件
foreach (string filePath in allFiles)
{
var relativePath = Path.GetRelativePath(localFolderPath, filePath);
var objectName = $"{remoteTargetPath}{relativePath.Replace('\\', '/')}";
// 报告进度
var progressPercent = 10 + (int)(80 * uploadedFiles / (double)totalFiles);
_progressSubject.OnNext((progressPercent, $"上传: {relativePath}"));
// 创建上传请求
//var putRequest = new PutObjectRequest(
// bucketName,
// objectName,
// filePath);
////添加进度监听
//putRequest.StreamTransferProgress += (_, args) =>
//{
// if (args.TotalBytes > 0)
// {
// var fileProgress = (int)(args.TransferredBytes * 100 / args.TotalBytes);
// _progressSubject.OnNext((
// progressPercent + (int)(fileProgress * 0.8 / totalFiles),
// $"{relativePath} ({fileProgress}%)"
// ));
// }
//};
// 执行上传
ossClient.PutObject(bucketName,objectName,filePath);
uploadedFiles++;
}
_progressSubject.OnNext((90, $"上传完成! 共 {uploadedFiles} 个文件"));
// 7. 处理构建日志和版本文件
ProcessBuildLogAndUpdateServerVersion(
localFolderPath,
remoteParentPath,
ossClient,
bucketName);
_progressSubject.OnNext((100, "所有操作完成!"));
}
catch (Exception ex)
{
_progressSubject.OnNext((0, $"操作失败: {ex.Message}"));
throw;
}
finally
{
_progressSubject.OnCompleted();
}
});
}
private (string accessKeyId, string accessKeySecret) ReadAccessKey(string csvPath)
{
if (!File.Exists(csvPath))
throw new FileNotFoundException("找不到 AccessKey.csv 文件");
var lines = File.ReadAllLines(csvPath);
if (lines.Length < 2)
throw new FormatException("AccessKey.csv 格式错误");
// 跳过标题行,直接读取第二行
var parts = lines[1].Split(',');
if (parts.Length != 2)
throw new FormatException("AccessKey.csv 应包含两列数据");
return (parts[0].Trim(), parts[1].Trim());
}
private void ProcessBuildLogAndUpdateServerVersion(
string localFolderPath,
string remoteParentPath,
OssClient ossClient,
string bucketName)
{
try
{
_progressSubject.OnNext((91, "开始处理 BuildLog.txt..."));
// 1. 提取项目标识符
var projectIdentifier = remoteParentPath.Split('/').LastOrDefault();
if (string.IsNullOrEmpty(projectIdentifier))
throw new Exception("无法提取项目标识符");
// 2. 定位 BuildLog.txt
var buildReportDir = Path.Combine(
Directory.GetParent(Path.GetDirectoryName(localFolderPath))!.FullName,
"BuildReport");
var buildLogPath = Path.Combine(
buildReportDir,
Path.GetFileName(localFolderPath),
"BuildLog.txt");
if (!File.Exists(buildLogPath))
throw new FileNotFoundException($"找不到 BuildLog.txt: {buildLogPath}");
// 3. 读取日志内容
var buildLogContent = File.ReadAllText(buildLogPath);
_progressSubject.OnNext((92, "BuildLog.txt 读取成功"));
// 4. 准备远程版本文件路径
var remoteVersionPath = $"{remoteParentPath.TrimEnd('/')}/server_version.txt";
// 5. 下载现有版本文件
string serverVersionContent;
using (var stream = new MemoryStream())
{
ossClient.GetObject(new GetObjectRequest(bucketName, remoteVersionPath), stream);
stream.Position = 0;
using var reader = new StreamReader(stream);
serverVersionContent = reader.ReadToEnd();
}
_progressSubject.OnNext((93, "server_version.txt 下载成功"));
// 6. 解析并更新内容
var finalJson = ParseBuildLogContent(
buildLogContent,
serverVersionContent,
projectIdentifier);
_progressSubject.OnNext((94, "版本信息解析完成"));
// 7. 上传更新后的版本文件
using (var jsonStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(finalJson)))
{
ossClient.PutObject(bucketName, remoteVersionPath, jsonStream);
}
_progressSubject.OnNext((95, "server_version.txt 更新成功"));
}
catch (Exception ex)
{
_progressSubject.OnNext((0, $"处理失败: {ex.Message}"));
throw;
}
}
private string ParseBuildLogContent(string buildLogContent, string serverVersionJson, string projectIdentifier)
{
try
{
// 解析现有的server_version.json
var serverVersion = JsonNode.Parse(serverVersionJson)?.AsObject();
if (serverVersion == null) throw new Exception("无效的 JSON 格式");
// 从build log中提取信息
var versionListPathLine = buildLogContent.Split('\n')
.FirstOrDefault(line => line.Contains("updatable version list path is"));
if (versionListPathLine == null)
throw new Exception("在build log中找不到版本列表信息");
// 使用字符串操作提取值
var versionListLength = ExtractValue(versionListPathLine, "length is", "', hash");
var versionListHashCode = ExtractValue(versionListPathLine, "hash code is", "[");
var compressedLength = ExtractValue(versionListPathLine, "compressed length is", "', compressed");
var compressedHashCode = ExtractValue(versionListPathLine, "compressed hash code is", "[");
// 改进版本文件夹名称提取逻辑
string versionFolder = null;
// 方法1从版本列表路径中提取
var versionListPath = ExtractValue(versionListPathLine, "updatable version list path is", ",");
if (!string.IsNullOrEmpty(versionListPath))
{
var pathSegments = versionListPath.Trim('\'').Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
versionFolder = pathSegments.FirstOrDefault(s =>
s.Contains('_') &&
s.Split('_').Length >= 4 &&
s.Split('_').All(part => int.TryParse(part, out _)));
}
// 方法2如果方法1失败从完整路径中提取
if (string.IsNullOrEmpty(versionFolder))
{
var fullPathLine = buildLogContent.Split('\n')
.FirstOrDefault(line => line.Contains("Output full is selected, path is"));
if (fullPathLine != null)
{
var fullPath = ExtractValue(fullPathLine, "path is", "'").Trim('\'');
var pathSegments = fullPath.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
versionFolder = pathSegments.FirstOrDefault(s =>
s.Contains('_') &&
s.Split('_').Length >= 4 &&
s.Split('_').All(part => int.TryParse(part, out _)));
}
}
if (string.IsNullOrEmpty(versionFolder))
throw new Exception($"无法从路径中提取版本信息。Build log内容:\n{buildLogContent}");
// 更新JSON中的值
serverVersion["VersionListLength"] = long.Parse(versionListLength);
serverVersion["VersionListHashCode"] = long.Parse(versionListHashCode);
serverVersion["VersionListZipLength"] = long.Parse(compressedLength);
serverVersion["VersionListZipHashCode"] = long.Parse(compressedHashCode);
// 构建更新URI前缀
var existingUri = serverVersion["UpdatePrefixUri"]?.GetValue<string>();
var uriBase = existingUri?[..(existingUri.IndexOf("/static/", StringComparison.Ordinal) + "/static/".Length)]
?? "http://1.15.182.107/static/";
var updatePrefixUri = $"{uriBase}{projectIdentifier}/{versionFolder}/Android";
serverVersion["UpdatePrefixUri"] = updatePrefixUri;
return serverVersion.ToJsonString(new JsonSerializerOptions { WriteIndented = true });
}
catch (Exception ex)
{
_progressSubject.OnNext((0, $"解析BuildLog.txt失败: {ex.Message}"));
throw;
}
}
private string ExtractValue(string text, string startMarker, string endMarker)
{
if (string.IsNullOrEmpty(text)) return null;
var startIndex = text.IndexOf(startMarker);
if (startIndex < 0) return null;
startIndex += startMarker.Length;
var endIndex = text.IndexOf(endMarker, startIndex);
if (endIndex < 0) endIndex = text.Length;
return text[startIndex..endIndex].Trim().Trim('\'');
}
}
}

View File

@ -0,0 +1,163 @@
using Aliyun.OSS;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace AvaloniaApplication2.Script
{
public class SshUploadHotUpdate
{
public async Task UploadFolderAsync(string bucketName, string localFolderPath, string remoteParentPath, string RemoteResourcePath)
{
await Task.Run(() =>
{
try
{
var endpoint = "oss-cn-heyuan.aliyuncs.com"; // 根据实际情况修改
if (bucketName == "merge-pet-us")
{
endpoint = "oss-us-west-1.aliyuncs.com";
} //var bucketName = "merge-pet-client";
var accessKeyId = "LTAI5tNwqEoUk4xhmih23N1H";
var accessKeySecret = "j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu";
if (!Directory.Exists(localFolderPath))
throw new DirectoryNotFoundException($"本地文件夹不存在: {localFolderPath}");
var parentDir = Directory.GetParent(localFolderPath)?.FullName;
if (parentDir == null)
throw new DirectoryNotFoundException("无法获取本地文件夹的父目录");
var hotUpdateDllPath = Path.Combine(parentDir, "HybridCLRData", "HotUpdateDlls", "Android", "HotUpdate.dll");
if (!File.Exists(hotUpdateDllPath))
throw new FileNotFoundException($"找不到热更新DLL文件: {hotUpdateDllPath}");
var ossClient = new OssClient(endpoint, accessKeyId, accessKeySecret);
//ossClient.SetRegion("cn-heyuan");
if (bucketName == "merge-pet-us")
{
ossClient.SetRegion("us-west-1");
}
else
{
ossClient.SetRegion("cn-heyuan");
}
// 1. 上传 HotUpdate.dll
var timestamp = DateTime.Now.ToString("yyyyMMddHHmm");
var remoteTargetFile = $"{remoteParentPath.TrimEnd('/')}/HotUpdate.dll.bytes";
var remoteBackupFile = $"{remoteParentPath.TrimEnd('/')}/BackUp/HotUpdate.dll.bytes{timestamp}";
if (ossClient.DoesObjectExist(bucketName, remoteTargetFile))
{
var request = new CopyObjectRequest(
bucketName, remoteTargetFile,
bucketName, remoteBackupFile);
ossClient.CopyObject(request);
}
using (var fs = File.Open(hotUpdateDllPath, FileMode.Open))
{
var metadata = new ObjectMetadata { ContentType = "application/octet-stream" };
ossClient.PutObject(bucketName, remoteTargetFile, fs, metadata);
}
Console.WriteLine($"文件上传成功: {bucketName}/{remoteTargetFile}");
// 2. 更新 server_version.txt
var serverVersionPath = $"{RemoteResourcePath.TrimEnd('/')}/server_version.txt";
var backupServerVersionPath = $"{RemoteResourcePath.TrimEnd('/')}/BackUp/server_version.txt{timestamp}";
// 下载 server_version.txt
if (!ossClient.DoesObjectExist(bucketName, serverVersionPath))
throw new FileNotFoundException($"找不到server_version.txt文件: {serverVersionPath}");
// 备份原文件
if (ossClient.DoesObjectExist(bucketName, serverVersionPath))
{
var backupRequest = new CopyObjectRequest(
bucketName, serverVersionPath,
bucketName, backupServerVersionPath);
ossClient.CopyObject(backupRequest);
}
// 获取文件内容
var serverVersionObj = ossClient.GetObject(bucketName, serverVersionPath);
string jsonContent;
using (var reader = new StreamReader(serverVersionObj.Content))
{
jsonContent = reader.ReadToEnd();
}
// 解析并修改JSON
using (JsonDocument doc = JsonDocument.Parse(jsonContent))
{
var root = doc.RootElement;
using (var stream = new MemoryStream())
{
using (var writer = new Utf8JsonWriter(stream, new JsonWriterOptions { Indented = true }))
{
writer.WriteStartObject();
foreach (var element in root.EnumerateObject())
{
if (element.Name == "HotUpdateScripts")
{
string oldVersion = element.Value.GetString();
string newVersion = IncrementVersion(oldVersion);
writer.WriteString("HotUpdateScripts", newVersion);
}
else
{
writer.WritePropertyName(element.Name);
element.Value.WriteTo(writer);
}
}
writer.WriteEndObject();
}
stream.Position = 0;
using (var reader = new StreamReader(stream))
{
string updatedContent = reader.ReadToEnd();
// 上传修改后的文件
byte[] byteArray = Encoding.UTF8.GetBytes(updatedContent);
using (MemoryStream ms = new MemoryStream(byteArray))
{
var metadata = new ObjectMetadata
{
ContentType = "text/plain",
ContentLength = byteArray.Length
};
ossClient.PutObject(bucketName, serverVersionPath, ms, metadata);
}
}
}
}
Console.WriteLine("server_version.txt 更新成功");
}
catch (Exception ex)
{
Console.WriteLine($"上传过程中发生错误: {ex.Message}");
throw;
}
});
}
private string IncrementVersion(string version)
{
string[] parts = version.Split('.');
if (parts.Length < 1 || !int.TryParse(parts[^1], out int lastPart))
throw new FormatException("版本号格式错误");
lastPart++;
parts[^1] = lastPart.ToString();
return string.Join(".", parts);
}
}
}

View File

@ -0,0 +1,32 @@
using System;
using Avalonia.Controls;
using Avalonia.Controls.Templates;
using AvaloniaApplication2.ViewModels;
namespace AvaloniaApplication2
{
public class ViewLocator : IDataTemplate
{
public Control? Build(object? param)
{
if (param is null)
return null;
var name = param.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
var type = Type.GetType(name);
if (type != null)
{
return (Control)Activator.CreateInstance(type)!;
}
return new TextBlock { Text = "Not Found: " + name };
}
public bool Match(object? data)
{
return data is ViewModelBase;
}
}
}

View File

@ -0,0 +1,68 @@
using AvaloniaApplication2;
using ReactiveUI;
using System;
using System.Collections.ObjectModel;
using System.Linq;
namespace AvaloniaApplication2.ViewModels
{
public class MainWindowViewModel : ViewModelBase
{
private string _selectedServer;
private string _selectedBucket;
private string _selectedPath;
private readonly AppSettings _settings;
public string SelectedServer
{
get => _selectedServer;
set
{
this.RaiseAndSetIfChanged(ref _selectedServer, value);
SaveSettings();
}
}
public string SelectedBucket
{
get => _selectedBucket;
set
{
this.RaiseAndSetIfChanged(ref _selectedBucket, value);
SaveSettings();
}
}
public string SelectedPath
{
get => _selectedPath;
set
{
this.RaiseAndSetIfChanged(ref _selectedPath, value);
SaveSettings();
}
}
public ObservableCollection<string> Servers { get; } = new()
{
"zhb", "mwh", "zxx"
};
public MainWindowViewModel()
{
_settings = AppSettings.Load();
// 恢复设置
_selectedServer = _settings.SelectedServer ?? Servers.First();
_selectedBucket = _settings.SelectedBucket ?? Servers.First();
_selectedPath = _settings.SelectedPath ?? "E:\\WorkSpace\\ZHB4\\AB";
}
private void SaveSettings()
{
_settings.SelectedServer = SelectedServer;
_settings.SelectedBucket = SelectedBucket;
_settings.SelectedPath = SelectedPath;
_settings.Save();
}
}
}

View File

@ -0,0 +1,28 @@
// ViewModels/MessageDialogViewModel.cs
using ReactiveUI;
using System;
using System.Reactive;
namespace AvaloniaApplication2.ViewModels
{
public class MessageDialogViewModel : ReactiveObject
{
private string _message;
public string Message
{
get => _message;
set => this.RaiseAndSetIfChanged(ref _message, value);
}
public ReactiveCommand<Unit, Unit> ConfirmCommand { get; }
public MessageDialogViewModel(string message, Action onConfirm)
{
Message = message;
ConfirmCommand = ReactiveCommand.Create(() =>
{
onConfirm?.Invoke();
});
}
}
}

View File

@ -0,0 +1,65 @@
// ProgressWindowViewModel.cs
using System.ComponentModel;
using System.Reactive;
using System.Threading;
using System.Threading.Tasks;
using ReactiveUI;
namespace AvaloniaApplication2.ViewModels
{
public class ProgressWindowViewModel : ViewModelBase
{
//private int _progressValue;
//public int ProgressValue
//{
// get => _progressValue;
// set => this.RaiseAndSetIfChanged(ref _progressValue, value);
//}
//private bool _isIndeterminate = true;
//public bool IsIndeterminate
//{
// get => _isIndeterminate;
// set => this.RaiseAndSetIfChanged(ref _isIndeterminate, value);
//}
//public ReactiveCommand<Unit, Unit> CancelCommand { get; }
//public ProgressWindowViewModel()
//{
// CancelCommand = ReactiveCommand.Create(() => { /* 取消操作 */ });
//}
//// 模拟更新过程
//public async Task StartUpdate()
//{
// IsIndeterminate = false;
// for (int i = 0; i <= 100; i++)
// {
// ProgressValue = i;
// await Task.Delay(5); // 模拟工作
// }
//}
private int _progress;
public int Progress
{
get => _progress;
set => this.RaiseAndSetIfChanged(ref _progress, value);
}
private string _progressText = "准备上传...";
public string ProgressText
{
get => _progressText;
set => this.RaiseAndSetIfChanged(ref _progressText, value);
}
public ReactiveCommand<Unit, Unit> CancelCommand { get; }
public ProgressWindowViewModel()
{
CancelCommand = ReactiveCommand.Create(() => { /* 取消逻辑 */ });
}
}
}

View File

@ -0,0 +1,8 @@
using ReactiveUI;
namespace AvaloniaApplication2.ViewModels
{
public class ViewModelBase : ReactiveObject
{
}
}

View File

@ -0,0 +1,71 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaApplication2.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="450"
x:Class="AvaloniaApplication2.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="AvaloniaApplication2">
<Design.DataContext>
<!-- This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
<vm:MainWindowViewModel/>
</Design.DataContext>
<StackPanel>
<Border Margin="5" CornerRadius="10" Background="LightBlue">
<TextBlock Margin="5"
HorizontalAlignment="Center"
FontSize="24"
Text="更新工具" />
</Border>
<Grid ShowGridLines="False" Margin="5"
ColumnDefinitions="100, 200, 300"
RowDefinitions="Auto, Auto, Auto, Auto,Auto">
<Label Grid.Row="0" Grid.Column="0" Margin="10">桶后缀</Label>
<!--<ComboBox Grid.Row="0" Grid.Column="1"
SelectedIndex="1"
ItemsSource="{Binding Servers}"
SelectedItem="{Binding SelectedServer}"
Margin="5"/>-->
<TextBox Grid.Row="0" Grid.Column="1"
Text="{Binding SelectedBucket, Mode=TwoWay}"
Margin="5"/>
<Label Grid.Row="0" Grid.Column="2" Margin="10">us/client</Label>
<Label Grid.Row="1" Grid.Column="0" Margin="10">资源后缀</Label>
<!--<ComboBox Grid.Row="0" Grid.Column="1"
SelectedIndex="1"
ItemsSource="{Binding Servers}"
SelectedItem="{Binding SelectedServer}"
Margin="5"/>-->
<TextBox Grid.Row="1" Grid.Column="1"
Text="{Binding SelectedServer, Mode=TwoWay}"
Margin="5"/>
<Label Grid.Row="2" Grid.Column="0" Margin="10">路径</Label>
<TextBox x:Name="PathTextBox"
Grid.Row="2" Grid.Column="1"
Margin="0 5"
Text="{Binding SelectedPath, Mode=TwoWay}"
Width="200"
IsReadOnly="True"/>
<Button Grid.Row="2" Grid.Column="2"
Content="选择路径"
Click="OnSelectFolderButtonClick" />
<Button Grid.Row="3" Grid.Column="1"
Content="更新资源"
Click="OnStartResourceClick" />
<Button Grid.Row="4" Grid.Column="1"
Content="更新脚本"
Click="OnStartScriptClick" />
<Button Grid.Row="3" Grid.Column="2"
Content="URL刷新CDN"
Click="OnFlushFileCDNClick" />
<Button Grid.Row="4" Grid.Column="2"
Content="目录刷新CDN"
Click="OnFlushDirectoryCDNClick" />
</Grid>
</StackPanel>
</Window>

View File

@ -0,0 +1,538 @@
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
using System.ComponentModel;
using System.Threading.Tasks;
using AvaloniaApplication2.ViewModels;
using AvaloniaApplication2.Script;
using System.Diagnostics;
using System;
using System.IO;
using ReactiveUI;
//using Aliyun.OSS;
//using Aliyun.OSS.Common;
using AlibabaCloud.SDK.Cdn20180510;
using AlibabaCloud.SDK.Cdn20180510.Models;
using System.Text;
namespace AvaloniaApplication2.Views
{
public partial class MainWindow : Window
{
private readonly ScpUploadService _uploadService = new();
private ProgressWindow _progressWindow;
public MainWindow()
{
InitializeComponent();
}
private async void OnSelectFolderButtonClick(object sender, RoutedEventArgs e)
{
//// 获取顶级窗口,以便显示文件夹对话框
//var topLevel = TopLevel.GetTopLevel(this);
//// 启动文件夹选择对话框
//var folders = await topLevel.StorageProvider.OpenFolderPickerAsync(new FolderPickerOpenOptions
//{
// Title = "选择文件夹",
// AllowMultiple = false
//});
//// 如果用户选择了文件夹
//if (folders.Count > 0 && folders[0] is IStorageFolder selectedFolder)
//{
// // 更新 TextBox 的文本
// PathTextBox.Text = selectedFolder.Path.LocalPath;
//}
var dialog = new OpenFolderDialog();
var result = await dialog.ShowAsync(this);
if (!string.IsNullOrWhiteSpace(result))
{
if (DataContext is MainWindowViewModel vm)
{
vm.SelectedPath = result;
}
}
}
// 在你的主窗口类中添加这个方法
private async void OnStartResourceClick(object sender, RoutedEventArgs e)
{
//var progressWindow = new ProgressWindow();
//var viewModel = (ProgressWindowViewModel)progressWindow.DataContext;
string path = PathTextBox.Text;
string serverType = "";
string bucketType = "";
if (DataContext is MainWindowViewModel vm)
{
Debug.WriteLine($"选中的桶: {vm.SelectedBucket}");
Debug.WriteLine($"选中的服务器: {vm.SelectedServer}");
serverType = vm.SelectedServer;
bucketType = vm.SelectedBucket;
}
string fullDir = GetNewFullDir(path);
if (fullDir == null)
{
}
else
{
Console.WriteLine(fullDir);
//ShowCustomDialog(fullDir);
}
if (fullDir != null && serverType != "" && bucketType!= "")
{
string serverPath = "static/AplusB_Pet_C_" + serverType;
string serverHotupdatePath = "static/HotUpdate_" + serverType;
string bucketName = "merge-pet-" + bucketType;
// 上传脚本
//await UploadHotUpdateScript(path, serverHotupdatePath);
// 上传文件
await UploadFolder(bucketName, fullDir, serverPath);
}
// 上传到服务器上
// 显示进度窗口
//progressWindow.Show();
//// 在后台线程中执行更新任务
//await Task.Run(async () =>
//{
// await viewModel.StartUpdate();
// // 更新完成后关闭窗口
// Dispatcher.UIThread.Post(() => progressWindow.Close());
//});
//ShowCustomDialog();
}
private void MyButton_Click(object sender, RoutedEventArgs e)
{
// 在这里编写您的逻辑
}
private void OnFlushDirectoryCDNClick(object sender, RoutedEventArgs e)
{
var config = new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = "LTAI5tNwqEoUk4xhmih23N1H",
AccessKeySecret = "j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu",
Endpoint = "cdn.aliyuncs.com"
};
string serverType = "";
string bucketType = "";
if (DataContext is MainWindowViewModel vm)
{
Debug.WriteLine($"选中的桶: {vm.SelectedBucket}");
Debug.WriteLine($"选中的服务器: {vm.SelectedServer}");
serverType = vm.SelectedServer;
bucketType = vm.SelectedBucket;
}
// 创建CDN客户端
var client = new Client(config);
string prefix = "download";
if (bucketType == "us")
{
prefix = "downloadus";
}
// 创建刷新请求
var request = new RefreshObjectCachesRequest
{
ObjectPath = $"https://{prefix}.bywaystudios.com/static/", // 要刷新的URL
ObjectType = "Directory" // File: URL刷新, Directory: 目录刷新
};
// 执行刷新
try
{
var response = client.RefreshObjectCaches(request);
ShowCustomDialog($"刷新成功任务ID: {response.Body.RefreshTaskId}");
}
catch (Exception ex)
{
ShowCustomDialog($"刷新失败: {ex.Message}");
}
}
private void OnFlushFileCDNClick(object sender, RoutedEventArgs e)
{
var config = new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = "LTAI5tNwqEoUk4xhmih23N1H",
AccessKeySecret = "j9YmDvSkYmtxlQ0P50zTDtj9uHzXLu",
Endpoint = "cdn.aliyuncs.com"
};
string serverType = "";
string bucketType = "";
if (DataContext is MainWindowViewModel vm)
{
Debug.WriteLine($"选中的桶: {vm.SelectedBucket}");
Debug.WriteLine($"选中的服务器: {vm.SelectedServer}");
serverType = vm.SelectedServer;
bucketType = vm.SelectedBucket;
}
// 创建CDN客户端
var client = new Client(config);
// 创建刷新请求
StringBuilder sb = new StringBuilder();
string prefix = "download";
if(bucketType == "us")
{
prefix = "downloadus";
}
sb.AppendLine($"https://{prefix}.bywaystudios.com/static/HotUpdate_{serverType}/HotUpdate.dll.bytes");
sb.Append($"https://{prefix}.bywaystudios.com/static/AplusB_Pet_C_{serverType}/server_version.txt");
string OP = sb.ToString();
//Console.WriteLine(OP);
//ShowCustomDialog($"刷新失败: {OP}");
//return;
var request = new RefreshObjectCachesRequest
{
ObjectPath = OP, // 要刷新的URL
ObjectType = "File" // File: URL刷新, Directory: 目录刷新
};
// 执行刷新
try
{
var response = client.RefreshObjectCaches(request);
ShowCustomDialog($"刷新成功任务ID: {response.Body.RefreshTaskId}");
}
catch (Exception ex)
{
ShowCustomDialog($"刷新失败: {ex.Message}");
}
}
private async void OnStartScriptClick(object sender, RoutedEventArgs e)
{
string path = PathTextBox.Text;
string serverType = "";
string bucketType = "";
if (DataContext is MainWindowViewModel vm)
{
Debug.WriteLine($"选中的桶: {vm.SelectedBucket}");
Debug.WriteLine($"选中的服务器: {vm.SelectedServer}");
serverType = vm.SelectedServer;
bucketType = vm.SelectedBucket;
}
string fullDir = GetNewFullDir(path);
if (fullDir == null)
{
}
else
{
Console.WriteLine(fullDir);
//ShowCustomDialog(fullDir);
}
if (fullDir != null && serverType != "" && bucketType != "")
{
string serverPath = "static/AplusB_Pet_C_" + serverType;
string serverHotupdatePath = "static/HotUpdate_" + serverType;
string bucketName = "merge-pet-" + bucketType;
// 上传脚本
await UploadHotUpdateScript(bucketName, path, serverHotupdatePath,serverPath);
}
}
private string GetNewFullDir(string originpath)
{
string fullFolderPath = Path.Combine(originpath, "Full");
try
{
if (Directory.Exists(fullFolderPath))
{
// 获取Full文件夹下的所有子目录
DirectoryInfo[] subDirectories = new DirectoryInfo(fullFolderPath).GetDirectories();
if (subDirectories.Length == 0)
{
Console.WriteLine("Full文件夹中没有子文件夹。");
ShowCustomDialog("Full文件夹中没有子文件夹");
return null;
}
// 按最后修改时间排序(最新的在前面)
Array.Sort(subDirectories, (x, y) => y.LastWriteTime.CompareTo(x.LastWriteTime));
// 获取最新的文件夹
DirectoryInfo newestFolder = subDirectories[0];
string newestFolderPath = newestFolder.FullName;
long size = CalculateFolderSize(newestFolderPath);
double sizeInMB = size / (1024.0 * 1024.0);
Console.WriteLine($"最新修改的文件夹路径是: {newestFolderPath}");
Console.WriteLine($"最后修改时间: {newestFolder.LastWriteTime}");
if (sizeInMB < 100)
{
Console.WriteLine("文件夹内容过小,可能打包失败");
ShowCustomDialog("文件夹内容过小,可能打包失败");
return null;
}
else
{
return newestFolderPath;
}
}
else
{
Console.WriteLine("Full文件夹不存在。");
ShowCustomDialog("Full文件夹不存在");
return null;
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
ShowCustomDialog($"发生错误: {ex.Message}");
return null;
}
}
private string GetNewReportDir(string originpath)
{
string reportFolderPath = Path.Combine(originpath, "BuildReport");
try
{
if (Directory.Exists(reportFolderPath))
{
// 获取BuildReport文件夹下的所有子目录
DirectoryInfo[] subDirectories = new DirectoryInfo(reportFolderPath).GetDirectories();
if (subDirectories.Length == 0)
{
Console.WriteLine("BuildReport文件夹中没有子文件夹。");
ShowCustomDialog("BuildReport文件夹中没有子文件夹");
return null;
}
// 按最后修改时间排序(最新的在前面)
Array.Sort(subDirectories, (x, y) => y.LastWriteTime.CompareTo(x.LastWriteTime));
// 获取最新的文件夹
DirectoryInfo newestFolder = subDirectories[0];
string newestFolderPath = newestFolder.FullName;
Console.WriteLine($"最新修改的文件夹路径是: {newestFolderPath}");
Console.WriteLine($"最后修改时间: {newestFolder.LastWriteTime}");
return newestFolderPath;
}
else
{
Console.WriteLine("BuildReport文件夹不存在。");
ShowCustomDialog("BuildReport文件夹不存在");
return null;
}
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
ShowCustomDialog($"发生错误: {ex.Message}");
return null;
}
}
// 在任何需要弹窗的地方(如按钮点击事件)
public void ShowCustomDialog(string Message)
{
// 定义弹窗参数
string errorMessage = Message;
Action onConfirm = () =>
{
//Console.WriteLine("用户点击了确认");
// 这里可以执行确认后的逻辑
};
// 创建并显示弹窗
var dialog = new MessageDialog(errorMessage, onConfirm);
dialog.Show();
}
/// <summary>
/// 计算文件夹大小
/// </summary>
/// <param name="folderPath"></param>
/// <returns></returns>
long CalculateFolderSize(string folderPath)
{
long size = 0;
foreach (string file in Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories))
{
FileInfo fileInfo = new FileInfo(file);
size += fileInfo.Length;
}
return size;
}
public async Task UploadHotUpdateScript(string bucketName, string localFolder, string remoteFolder,string remoteResourcePath)
{
//var localFolder = "C:\\local\\folder";
//var remoteFolder = "/remote/folder";
var uploader = new SshUploadHotUpdate();
Action onConfirm = () =>
{
//Console.WriteLine("用户点击了确认");
// 这里可以执行确认后的逻辑
};
var dialog = new MessageDialog("请稍等", onConfirm);
dialog.Show();
try
{
await uploader.UploadFolderAsync(
bucketName,
localFolder,
remoteFolder,
remoteResourcePath
);
if (!Directory.Exists(localFolder))
throw new DirectoryNotFoundException($"本地文件夹不存在: {localFolder}");
var parentDir = Directory.GetParent(localFolder)?.FullName;
if (parentDir == null)
throw new DirectoryNotFoundException("无法获取本地文件夹的父目录");
// 构建HotUpdate.dll的完整路径
var hotUpdateDllPath = Path.Combine(parentDir, "HybridCLRData", "HotUpdateDlls", "Android", "HotUpdate.dll");
if (!File.Exists(hotUpdateDllPath))
throw new FileNotFoundException($"找不到热更新DLL文件: {hotUpdateDllPath}");
// 获取文件信息
FileInfo fileInfo = new FileInfo(hotUpdateDllPath);
// 获取最后修改时间(格式化为易读格式)
string lastModified = fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss");
// 获取文件大小(自动转换为合适单位)
string fileSize;
long length = fileInfo.Length;
if (length >= 1024 * 1024) // MB
fileSize = $"{(length / (1024.0 * 1024.0)):0.00} MB";
else if (length >= 1024) // KB
fileSize = $"{(length / 1024.0):0.00} KB";
else // Bytes
fileSize = $"{length} Bytes";
// 填充对话框信息
ShowCustomDialog($"脚本上传成功 || 本地脚本更新时间为:{lastModified} || 文件大小为:{fileSize}");
//ShowCustomDialog("脚本上传成功 || 本地脚本更新时间为:|| 文件大小为:");
}
catch (Exception ex)
{
ShowCustomDialog($"脚本上传失败: {ex.Message}");
}
finally
{
dialog.Close();
}
}
public async Task UploadFolder(string bucketName, string localFolder, string remoteFolder)
{
// 创建并显示进度窗口
_progressWindow = new ProgressWindow
{
DataContext = new ProgressWindowViewModel()
};
_progressWindow.Show();
// 订阅进度更新使用Dispatcher确保UI线程操作
//_uploadService.Progress.Subscribe(update =>
//{
// Dispatcher.UIThread.Post(() =>
// {
// if (_progressWindow.DataContext is ProgressWindowViewModel vm)
// {
// vm.Progress = update.progress;
// vm.ProgressText = update.status;
// }
// });
//},
//() => Dispatcher.UIThread.Post(() => _progressWindow.Close()));
_uploadService.Progress.Subscribe(update =>
{
Dispatcher.UIThread.Post(() =>
{
if (_progressWindow.DataContext is ProgressWindowViewModel vm)
{
vm.Progress = update.progress;
vm.ProgressText = update.status;
}
});
},
() => Dispatcher.UIThread.Post(() => _progressWindow.Close()));
try
{
//Console.WriteLine(remoteFolder);
await _uploadService.UploadFolderAsync(bucketName, localFolder, remoteFolder);
ShowCustomDialog("资源上传成功");
}
catch (Exception ex)
{
Dispatcher.UIThread.Post(() =>
{
if (_progressWindow.DataContext is ProgressWindowViewModel vm)
{
vm.ProgressText = $"上传失败: {ex.Message}";
ShowCustomDialog($"资源上传失败: {ex.Message}");
}
});
}
}
}
}

View File

@ -0,0 +1,16 @@
<!-- Views/MessageDialog.axaml -->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaApplication2.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="AvaloniaApplication2.Views.MessageDialog"
x:DataType="vm:MessageDialogViewModel"
Title="提示"
Width="300"
Height="200">
<StackPanel Margin="20" Spacing="10">
<TextBlock x:Name="MessageText" Text="{Binding Message}" TextWrapping="Wrap"/>
<Button Content="确认" Command="{Binding ConfirmCommand}" HorizontalAlignment="Center"/>
</StackPanel>
</Window>

View File

@ -0,0 +1,27 @@
// Views/MessageDialog.axaml.cs
using AvaloniaApplication2.ViewModels;
using Avalonia.Controls;
using System;
namespace AvaloniaApplication2.Views
{
public partial class MessageDialog : Window
{
public MessageDialog()
{
InitializeComponent();
}
// 通过构造函数传递参数
public MessageDialog(string message, Action onConfirm)
{
InitializeComponent();
DataContext = new MessageDialogViewModel(message, () =>
{
onConfirm?.Invoke();
this.Close();
});
}
}
}

View File

@ -0,0 +1,29 @@
<!-- ProgressWindow.axaml -->
<!--<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaApplication2.ViewModels"
x:Class="AvaloniaApplication2.Views.ProgressWindow"
x:DataType="vm:ProgressWindowViewModel"
Title="更新进度"
Width="300"
Height="150">-->
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaApplication2.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="450"
x:Class="AvaloniaApplication2.Views.ProgressWindow"
x:DataType="vm:ProgressWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="进度">
<StackPanel Margin="20">
<TextBlock Text="正在上传文件..." Margin="0 0 0 10"/>
<ProgressBar Minimum="0" Maximum="100" Value="{Binding Progress}"/>
<TextBlock Text="{Binding ProgressText}" Margin="0 10 0 0"/>
<Button Content="取消" Command="{Binding CancelCommand}" Margin="0 20 0 0"/>
</StackPanel>
</Window>

View File

@ -0,0 +1,21 @@
// ProgressWindow.axaml.cs
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using AvaloniaApplication2.ViewModels;
namespace AvaloniaApplication2.Views
{
public partial class ProgressWindow : Window
{
public ProgressWindow()
{
InitializeComponent();
DataContext = new ProgressWindowViewModel();
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- This manifest is used on Windows only.
Don't remove it as it might cause problems with window transparency and embedded controls.
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
<assemblyIdentity version="1.0.0.0" name="AvaloniaApplication2.Desktop"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
</assembly>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,816 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"AvaloniaApplication2/1.0.0": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Desktop": "11.2.6",
"Avalonia.Diagnostics": "11.2.6",
"Avalonia.Fonts.Inter": "11.2.6",
"Avalonia.ReactiveUI": "11.2.6",
"Avalonia.Themes.Fluent": "11.2.6",
"Newtonsoft.Json": "13.0.3",
"SSH.NET": "2025.0.0"
},
"runtime": {
"AvaloniaApplication2.dll": {}
}
},
"Avalonia/11.2.6": {
"dependencies": {
"Avalonia.BuildServices": "0.0.31",
"Avalonia.Remote.Protocol": "11.2.6",
"MicroCom.Runtime": "0.11.0"
},
"runtime": {
"lib/net8.0/Avalonia.Base.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.Controls.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.DesignerSupport.dll": {
"assemblyVersion": "0.7.0.0",
"fileVersion": "0.7.0.0"
},
"lib/net8.0/Avalonia.Dialogs.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.Markup.Xaml.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.Markup.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.Metal.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.MicroCom.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.OpenGL.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.Vulkan.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
},
"lib/net8.0/Avalonia.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Angle.Windows.Natives/2.1.22045.20230930": {
"runtimeTargets": {
"runtimes/win-arm64/native/av_libglesv2.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "2.1.22045.0"
},
"runtimes/win-x64/native/av_libglesv2.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "2.1.22045.0"
},
"runtimes/win-x86/native/av_libglesv2.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "2.1.22045.0"
}
}
},
"Avalonia.BuildServices/0.0.31": {},
"Avalonia.Controls.ColorPicker/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Remote.Protocol": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Controls.ColorPicker.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Controls.DataGrid/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Remote.Protocol": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Controls.DataGrid.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Desktop/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Native": "11.2.6",
"Avalonia.Skia": "11.2.6",
"Avalonia.Win32": "11.2.6",
"Avalonia.X11": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Desktop.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Diagnostics/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Controls.ColorPicker": "11.2.6",
"Avalonia.Controls.DataGrid": "11.2.6",
"Avalonia.Themes.Simple": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Diagnostics.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Fonts.Inter/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Fonts.Inter.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.FreeDesktop/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Tmds.DBus.Protocol": "0.20.0"
},
"runtime": {
"lib/net8.0/Avalonia.FreeDesktop.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Native/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Native.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
},
"runtimeTargets": {
"runtimes/osx/native/libAvaloniaNative.dylib": {
"rid": "osx",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"Avalonia.ReactiveUI/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"ReactiveUI": "20.1.1",
"System.Reactive": "6.0.1"
},
"runtime": {
"lib/net8.0/Avalonia.ReactiveUI.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Remote.Protocol/11.2.6": {
"runtime": {
"lib/net8.0/Avalonia.Remote.Protocol.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Skia/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"HarfBuzzSharp": "7.3.0.3",
"HarfBuzzSharp.NativeAssets.Linux": "7.3.0.3",
"HarfBuzzSharp.NativeAssets.WebAssembly": "7.3.0.3",
"SkiaSharp": "2.88.9",
"SkiaSharp.NativeAssets.Linux": "2.88.9",
"SkiaSharp.NativeAssets.WebAssembly": "2.88.9"
},
"runtime": {
"lib/net8.0/Avalonia.Skia.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Themes.Fluent/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Themes.Fluent.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Themes.Simple/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.Themes.Simple.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.Win32/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.Angle.Windows.Natives": "2.1.22045.20230930"
},
"runtime": {
"lib/net8.0/Avalonia.Win32.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"Avalonia.X11/11.2.6": {
"dependencies": {
"Avalonia": "11.2.6",
"Avalonia.FreeDesktop": "11.2.6",
"Avalonia.Skia": "11.2.6"
},
"runtime": {
"lib/net8.0/Avalonia.X11.dll": {
"assemblyVersion": "11.2.6.0",
"fileVersion": "11.2.6.0"
}
}
},
"BouncyCastle.Cryptography/2.5.1": {
"runtime": {
"lib/net6.0/BouncyCastle.Cryptography.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.5.1.28965"
}
}
},
"DynamicData/8.4.1": {
"dependencies": {
"System.Reactive": "6.0.1"
},
"runtime": {
"lib/net8.0/DynamicData.dll": {
"assemblyVersion": "8.4.0.0",
"fileVersion": "8.4.1.20756"
}
}
},
"HarfBuzzSharp/7.3.0.3": {
"dependencies": {
"HarfBuzzSharp.NativeAssets.Win32": "7.3.0.3",
"HarfBuzzSharp.NativeAssets.macOS": "7.3.0.3"
},
"runtime": {
"lib/net6.0/HarfBuzzSharp.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "7.3.0.3"
}
}
},
"HarfBuzzSharp.NativeAssets.Linux/7.3.0.3": {
"dependencies": {
"HarfBuzzSharp": "7.3.0.3"
},
"runtimeTargets": {
"runtimes/linux-arm/native/libHarfBuzzSharp.so": {
"rid": "linux-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-arm64/native/libHarfBuzzSharp.so": {
"rid": "linux-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-musl-x64/native/libHarfBuzzSharp.so": {
"rid": "linux-musl-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-x64/native/libHarfBuzzSharp.so": {
"rid": "linux-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"HarfBuzzSharp.NativeAssets.macOS/7.3.0.3": {
"runtimeTargets": {
"runtimes/osx/native/libHarfBuzzSharp.dylib": {
"rid": "osx",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"HarfBuzzSharp.NativeAssets.WebAssembly/7.3.0.3": {},
"HarfBuzzSharp.NativeAssets.Win32/7.3.0.3": {
"runtimeTargets": {
"runtimes/win-arm64/native/libHarfBuzzSharp.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x64/native/libHarfBuzzSharp.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x86/native/libHarfBuzzSharp.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"MicroCom.Runtime/0.11.0": {
"runtime": {
"lib/net5.0/MicroCom.Runtime.dll": {
"assemblyVersion": "0.11.0.0",
"fileVersion": "0.11.0.0"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"runtime": {
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1024.46610"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
},
"runtime": {
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.1325.6609"
}
}
},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"ReactiveUI/20.1.1": {
"dependencies": {
"DynamicData": "8.4.1",
"Splat": "15.1.1",
"System.ComponentModel.Annotations": "5.0.0"
},
"runtime": {
"lib/net8.0/ReactiveUI.dll": {
"assemblyVersion": "20.1.0.0",
"fileVersion": "20.1.1.46356"
}
}
},
"SkiaSharp/2.88.9": {
"dependencies": {
"SkiaSharp.NativeAssets.Win32": "2.88.9",
"SkiaSharp.NativeAssets.macOS": "2.88.9"
},
"runtime": {
"lib/net6.0/SkiaSharp.dll": {
"assemblyVersion": "2.88.0.0",
"fileVersion": "2.88.9.0"
}
}
},
"SkiaSharp.NativeAssets.Linux/2.88.9": {
"dependencies": {
"SkiaSharp": "2.88.9"
},
"runtimeTargets": {
"runtimes/linux-arm/native/libSkiaSharp.so": {
"rid": "linux-arm",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-arm64/native/libSkiaSharp.so": {
"rid": "linux-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-musl-x64/native/libSkiaSharp.so": {
"rid": "linux-musl-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/linux-x64/native/libSkiaSharp.so": {
"rid": "linux-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"SkiaSharp.NativeAssets.macOS/2.88.9": {
"runtimeTargets": {
"runtimes/osx/native/libSkiaSharp.dylib": {
"rid": "osx",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"SkiaSharp.NativeAssets.WebAssembly/2.88.9": {},
"SkiaSharp.NativeAssets.Win32/2.88.9": {
"runtimeTargets": {
"runtimes/win-arm64/native/libSkiaSharp.dll": {
"rid": "win-arm64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x64/native/libSkiaSharp.dll": {
"rid": "win-x64",
"assetType": "native",
"fileVersion": "0.0.0.0"
},
"runtimes/win-x86/native/libSkiaSharp.dll": {
"rid": "win-x86",
"assetType": "native",
"fileVersion": "0.0.0.0"
}
}
},
"Splat/15.1.1": {
"runtime": {
"lib/net8.0/Splat.dll": {
"assemblyVersion": "15.1.0.0",
"fileVersion": "15.1.1.17670"
}
}
},
"SSH.NET/2025.0.0": {
"dependencies": {
"BouncyCastle.Cryptography": "2.5.1",
"Microsoft.Extensions.Logging.Abstractions": "8.0.3"
},
"runtime": {
"lib/net8.0/Renci.SshNet.dll": {
"assemblyVersion": "2025.0.0.1",
"fileVersion": "2025.0.0.1"
}
}
},
"System.ComponentModel.Annotations/5.0.0": {},
"System.IO.Pipelines/8.0.0": {
"runtime": {
"lib/net8.0/System.IO.Pipelines.dll": {
"assemblyVersion": "8.0.0.0",
"fileVersion": "8.0.23.53103"
}
}
},
"System.Reactive/6.0.1": {
"runtime": {
"lib/net6.0/System.Reactive.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.1.7420"
}
}
},
"Tmds.DBus.Protocol/0.20.0": {
"dependencies": {
"System.IO.Pipelines": "8.0.0"
},
"runtime": {
"lib/net8.0/Tmds.DBus.Protocol.dll": {
"assemblyVersion": "0.20.0.0",
"fileVersion": "0.20.0.0"
}
}
}
}
},
"libraries": {
"AvaloniaApplication2/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Avalonia/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Z92CH5hMnI/gAWgNC4fyK07YRN33jpP9DS39cjii4pXXzaOhjNEKopecGZjcjZaAzeFPJWI6+UKnXFe2wf0ovA==",
"path": "avalonia/11.2.6",
"hashPath": "avalonia.11.2.6.nupkg.sha512"
},
"Avalonia.Angle.Windows.Natives/2.1.22045.20230930": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Bo3qOhKC1b84BIhiogndMdAzB3UrrESKK7hS769f5HWeoMw/pcd42US5KFYW2JJ4ZSTrXnP8mXwLTMzh+S+9Lg==",
"path": "avalonia.angle.windows.natives/2.1.22045.20230930",
"hashPath": "avalonia.angle.windows.natives.2.1.22045.20230930.nupkg.sha512"
},
"Avalonia.BuildServices/0.0.31": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==",
"path": "avalonia.buildservices/0.0.31",
"hashPath": "avalonia.buildservices.0.0.31.nupkg.sha512"
},
"Avalonia.Controls.ColorPicker/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LTq8Ii/SNW8+klJSGm6KkCfdfEBZDbTaFzAHoCJobYqZHv7Lev3OsfEWBsuIAAIGOibgFChNIkSEu4rAaD+yLQ==",
"path": "avalonia.controls.colorpicker/11.2.6",
"hashPath": "avalonia.controls.colorpicker.11.2.6.nupkg.sha512"
},
"Avalonia.Controls.DataGrid/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0Jj3c9q19ifY1VEXJgtdnH9AcGsuL/8NMrUq5R7H8qR6yRJm+OpnTqR3y3e2hl2EybVZ5mIiaJcmMoenu45ZqQ==",
"path": "avalonia.controls.datagrid/11.2.6",
"hashPath": "avalonia.controls.datagrid.11.2.6.nupkg.sha512"
},
"Avalonia.Desktop/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-x3GhSQj24+yzRJ5r435JeIfEMThGfhcXDpCU3qNdf8j6FI4mRaGGLhPk7CVlL7k//kr1gYaYFtE8vgab6Cyhsg==",
"path": "avalonia.desktop/11.2.6",
"hashPath": "avalonia.desktop.11.2.6.nupkg.sha512"
},
"Avalonia.Diagnostics/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-buw4qZ3DJfJHSC1D72WLIEAijBajNo8TkD+jOMsM8vYVCdvCJogldU9svPQ6R+Q90jOphUDHz117tp89q1/BTg==",
"path": "avalonia.diagnostics/11.2.6",
"hashPath": "avalonia.diagnostics.11.2.6.nupkg.sha512"
},
"Avalonia.Fonts.Inter/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-o6ZUiwJhiY8Nlqij/FfFwVcBWYtbY9cHgbB0/I6jfWPANzw1zfbF1HmpZKqDwzoofPAL0ZfgjWSOREGjoJNtKw==",
"path": "avalonia.fonts.inter/11.2.6",
"hashPath": "avalonia.fonts.inter.11.2.6.nupkg.sha512"
},
"Avalonia.FreeDesktop/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eRu99QcnJYvNl4rBT626L9oyctP4rhNmrv6h+ARcIJWVmvJIYl6UJoWTEL9UA3jlw6tBE+MdBPr2b3c5Y36ppw==",
"path": "avalonia.freedesktop/11.2.6",
"hashPath": "avalonia.freedesktop.11.2.6.nupkg.sha512"
},
"Avalonia.Native/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VtDBdjmvB8xQD5EAdmrOJ116+r3eSGrnB1FnTYdZv2jHLtoMaZnXWFGye0ZxXlXyzkoxW3yR0t7pB4Lj2YJRDw==",
"path": "avalonia.native/11.2.6",
"hashPath": "avalonia.native.11.2.6.nupkg.sha512"
},
"Avalonia.ReactiveUI/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U45px6NRdMxOPSsUVkTgjripRJQ2EUiGYit0MkZTBcX/hk2CsQbUhw/i9OYW7ofVz5YlVi3rUhzwXqe7fzLo1A==",
"path": "avalonia.reactiveui/11.2.6",
"hashPath": "avalonia.reactiveui.11.2.6.nupkg.sha512"
},
"Avalonia.Remote.Protocol/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0DVvZW6awq5piAnKD6+sb6JB30zY9wlaZPfR8vhRsvlJGZUx4By24SOku3cHZIvnS1Yxwca+IY5lr99FlJtF+Q==",
"path": "avalonia.remote.protocol/11.2.6",
"hashPath": "avalonia.remote.protocol.11.2.6.nupkg.sha512"
},
"Avalonia.Skia/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-1Y6JsUzmE4EH7txZewFG6TFhNX3Pfh9JijQSxtsu+RssrqrebsfXGm9eBEUJeGslFT4Okafl7rOM0SkHBR7xeg==",
"path": "avalonia.skia/11.2.6",
"hashPath": "avalonia.skia.11.2.6.nupkg.sha512"
},
"Avalonia.Themes.Fluent/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Bo6YsWq7bkwKVv+GOnSMo2dy0sbIW4S1Tt5/NKlUxfx0uzd6dl2Uypdt77xk3aHWdy1zQXbEGlkW8A4luIXKcA==",
"path": "avalonia.themes.fluent/11.2.6",
"hashPath": "avalonia.themes.fluent.11.2.6.nupkg.sha512"
},
"Avalonia.Themes.Simple/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-38jnpB8bcKKwuHmmR6aVwXT5oFs7pXXcBxLkePeSUku3p5Km8c3ujYA+tOBsyhOpnSWhvLtz1TLYWrDYKAgmRw==",
"path": "avalonia.themes.simple/11.2.6",
"hashPath": "avalonia.themes.simple.11.2.6.nupkg.sha512"
},
"Avalonia.Win32/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qsB+w/NOdoK6TUJXBfbAzhPGtlLHnzbB/Q3PC593h4eDq3M6Vp1yPw0R2SHFikcJJvpsXabnsT56R4l+1Lb9ug==",
"path": "avalonia.win32/11.2.6",
"hashPath": "avalonia.win32.11.2.6.nupkg.sha512"
},
"Avalonia.X11/11.2.6": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wWPkfrRARRkwvd4lE2wm7drK+L3vuITleYs6LPsG8e/eeiDKaxRegUkcyzulXxQgqq/h6D44aWiHpWQOPiSnWw==",
"path": "avalonia.x11/11.2.6",
"hashPath": "avalonia.x11.11.2.6.nupkg.sha512"
},
"BouncyCastle.Cryptography/2.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-zy8TMeTP+1FH2NrLaNZtdRbBdq7u5MI+NFZQOBSM69u5RFkciinwzV2eveY6Kjf5MzgsYvvl6kTStsj3JrXqkg==",
"path": "bouncycastle.cryptography/2.5.1",
"hashPath": "bouncycastle.cryptography.2.5.1.nupkg.sha512"
},
"DynamicData/8.4.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Mn1+fU/jqxgONEJq8KLQPGWEi7g/hUVTbjZyn4QM0sWWDAVOHPO9WjXWORSykwdfg/6S3GM15qsfz+2EvO+QAQ==",
"path": "dynamicdata/8.4.1",
"hashPath": "dynamicdata.8.4.1.nupkg.sha512"
},
"HarfBuzzSharp/7.3.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Hq+5+gx10coOvuRgB13KBwiWxJq1QeYuhtVLbA01ZCWaugOnolUahF44KvrQTUUHDNk/C7HB6SMaebsZeOdhgg==",
"path": "harfbuzzsharp/7.3.0.3",
"hashPath": "harfbuzzsharp.7.3.0.3.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.Linux/7.3.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-hkcHeTfOyIeJuPtO/QfoqkDvV/MXebZYaA/Bn/S+nXsjH3Wt9oQ6okH2kklYO+1UUdBSJFd67bi9IrpQXI2mPw==",
"path": "harfbuzzsharp.nativeassets.linux/7.3.0.3",
"hashPath": "harfbuzzsharp.nativeassets.linux.7.3.0.3.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.macOS/7.3.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UAwIYnkbBTzBJv1Id8FijY/i8QiIepRemSXufU8fyzwWhYJdx4+ajG8yQUie5HW/uusbVLFSr26muSlJOFDgSw==",
"path": "harfbuzzsharp.nativeassets.macos/7.3.0.3",
"hashPath": "harfbuzzsharp.nativeassets.macos.7.3.0.3.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.WebAssembly/7.3.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OpheDNp9a3nC6hWNACemWkNEXJ4tWP3Gw9bykw3FbyeEmU2nUDtLIp6VgNnjHAPRMgUs1Kl7m4gJpzVYwC7CZw==",
"path": "harfbuzzsharp.nativeassets.webassembly/7.3.0.3",
"hashPath": "harfbuzzsharp.nativeassets.webassembly.7.3.0.3.nupkg.sha512"
},
"HarfBuzzSharp.NativeAssets.Win32/7.3.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RPxRXD16KtSs8Yxr2RK9Qs7AwyN9MlpqZIYs0AvfaJwl7RAtVhC0+u2f2SKwX0uMYYd3O98Z+OBA1sj6aWVKQA==",
"path": "harfbuzzsharp.nativeassets.win32/7.3.0.3",
"hashPath": "harfbuzzsharp.nativeassets.win32.7.3.0.3.nupkg.sha512"
},
"MicroCom.Runtime/0.11.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-MEnrZ3UIiH40hjzMDsxrTyi8dtqB5ziv3iBeeU4bXsL/7NLSal9F1lZKpK+tfBRnUoDSdtcW3KufE4yhATOMCA==",
"path": "microcom.runtime/0.11.0",
"hashPath": "microcom.runtime.0.11.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/8.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
"path": "microsoft.extensions.logging.abstractions/8.0.3",
"hashPath": "microsoft.extensions.logging.abstractions.8.0.3.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"ReactiveUI/20.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9hNPknWjijnaSWs6auypoXqUptPZcRpUypF+cf1zD50fgW+SEoQda502N3fVZ2eWPcaiUad+z6GaLwOWmUVHNw==",
"path": "reactiveui/20.1.1",
"hashPath": "reactiveui.20.1.1.nupkg.sha512"
},
"SkiaSharp/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3MD5VHjXXieSHCleRLuaTXmL2pD0mB7CcOB1x2kA1I4bhptf4e3R27iM93264ZYuAq6mkUyX5XbcxnZvMJYc1Q==",
"path": "skiasharp/2.88.9",
"hashPath": "skiasharp.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.Linux/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cWSaJKVPWAaT/WIn9c8T5uT/l4ETwHxNJTkEOtNKjphNo8AW6TF9O32aRkxqw3l8GUdUo66Bu7EiqtFh/XG0Zg==",
"path": "skiasharp.nativeassets.linux/2.88.9",
"hashPath": "skiasharp.nativeassets.linux.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.macOS/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Nv5spmKc4505Ep7oUoJ5vp3KweFpeNqxpyGDWyeEPTX2uR6S6syXIm3gj75dM0YJz7NPvcix48mR5laqs8dPuA==",
"path": "skiasharp.nativeassets.macos/2.88.9",
"hashPath": "skiasharp.nativeassets.macos.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.WebAssembly/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==",
"path": "skiasharp.nativeassets.webassembly/2.88.9",
"hashPath": "skiasharp.nativeassets.webassembly.2.88.9.nupkg.sha512"
},
"SkiaSharp.NativeAssets.Win32/2.88.9": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wb2kYgU7iy84nQLYZwMeJXixvK++GoIuECjU4ECaUKNuflyRlJKyiRhN1MAHswvlvzuvkrjRWlK0Za6+kYQK7w==",
"path": "skiasharp.nativeassets.win32/2.88.9",
"hashPath": "skiasharp.nativeassets.win32.2.88.9.nupkg.sha512"
},
"Splat/15.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RHDTdF90FwVbRia2cmuIzkiVoETqnXSB2dDBBi/I35HWXqv4OKGqoMcfcd6obMvO2OmmY5PjU1M62K8LkJafAA==",
"path": "splat/15.1.1",
"hashPath": "splat.15.1.1.nupkg.sha512"
},
"SSH.NET/2025.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AKYbB+q2zFkNQbBFx5gXdv+Wje0baBtADQ35WnMKi4bg1ka74wTQtWoPd+fOWcydohdfsD0nfT8ErMOAPxtSfA==",
"path": "ssh.net/2025.0.0",
"hashPath": "ssh.net.2025.0.0.nupkg.sha512"
},
"System.ComponentModel.Annotations/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==",
"path": "system.componentmodel.annotations/5.0.0",
"hashPath": "system.componentmodel.annotations.5.0.0.nupkg.sha512"
},
"System.IO.Pipelines/8.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==",
"path": "system.io.pipelines/8.0.0",
"hashPath": "system.io.pipelines.8.0.0.nupkg.sha512"
},
"System.Reactive/6.0.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rHaWtKDwCi9qJ3ObKo8LHPMuuwv33YbmQi7TcUK1C264V3MFnOr5Im7QgCTdLniztP3GJyeiSg5x8NqYJFqRmg==",
"path": "system.reactive/6.0.1",
"hashPath": "system.reactive.6.0.1.nupkg.sha512"
},
"Tmds.DBus.Protocol/0.20.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2gkt2kuYPhDKd8gtl34jZSJOnn4nRJfFngCDcTZT/uySbK++ua0YQx2418l9Rn1Y4dE5XNq6zG9ZsE5ltLlNNw==",
"path": "tmds.dbus.protocol/0.20.0",
"hashPath": "tmds.dbus.protocol.0.20.0.nupkg.sha512"
}
}
}

View File

@ -0,0 +1,13 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Runtime.InteropServices.BuiltInComInterop.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More