From 9538196ab61fc2bc98142312c66c2ac1625abc42 Mon Sep 17 00:00:00 2001 From: MakesYT <2696703792@qq.com> Date: Thu, 6 Feb 2025 18:22:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E6=94=BEUrsa=E5=92=8CSemi=E5=88=B0Plu?= =?UTF-8?q?ginCore=20KitopiaEx=E6=96=B0=E5=A2=9E=20=E7=BD=AE=E9=A1=B6?= =?UTF-8?q?=E6=88=AA=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Plugin/AssemblyLoadContextH.cs | 9 +- Core/SDKs/Services/Plugin/PluginManager.cs | 83 ++++++++++--------- KitopiaAvalonia/App.axaml | 2 - KitopiaAvalonia/KitopiaAvalonia.csproj | 8 +- KitopiaAvalonia/Styles/FluentUiStyles.axaml | 1 + KitopiaEx/ImagePin/ImagePin.axaml | 20 +++++ KitopiaEx/ImagePin/ImagePin.axaml.cs | 34 ++++++++ KitopiaEx/ImagePin/ScreenCaptureEx.cs | 53 ++++++++++++ KitopiaEx/KitopiaEx.cs | 6 +- PluginCore | 2 +- 10 files changed, 165 insertions(+), 53 deletions(-) create mode 100644 KitopiaEx/ImagePin/ImagePin.axaml create mode 100644 KitopiaEx/ImagePin/ImagePin.axaml.cs create mode 100644 KitopiaEx/ImagePin/ScreenCaptureEx.cs diff --git a/Core/SDKs/Services/Plugin/AssemblyLoadContextH.cs b/Core/SDKs/Services/Plugin/AssemblyLoadContextH.cs index 3ebd229..10ff1b3 100644 --- a/Core/SDKs/Services/Plugin/AssemblyLoadContextH.cs +++ b/Core/SDKs/Services/Plugin/AssemblyLoadContextH.cs @@ -61,14 +61,9 @@ protected override Assembly Load(AssemblyName assemblyName) var assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName); if (assemblyPath != null) { - log.Debug(assemblyPath); - if (assemblyPath.EndsWith("WinRT.Runtime.dll") || assemblyPath.EndsWith("Microsoft.Windows.SDK.NET.dll") || - AppDomain.CurrentDomain.GetAssemblies().Any(x => x.GetName().FullName == assemblyName.FullName)) + + if (assemblyPath.EndsWith("WinRT.Runtime.dll") || assemblyPath.EndsWith("Microsoft.Windows.SDK.NET.dll")|| assemblyPath.EndsWith("PluginCore.dll")|| assemblyPath.EndsWith("Pinyin.NET.dll") ) { - if (assemblyPath.EndsWith("Microsoft.ML.OnnxRuntime.dll")) - { - return LoadFromAssemblyPath(assemblyPath); - } return null; } diff --git a/Core/SDKs/Services/Plugin/PluginManager.cs b/Core/SDKs/Services/Plugin/PluginManager.cs index e44ce75..1deaead 100644 --- a/Core/SDKs/Services/Plugin/PluginManager.cs +++ b/Core/SDKs/Services/Plugin/PluginManager.cs @@ -277,54 +277,61 @@ public static void Load(bool init = false) } - if (File.Exists($"{directoryInfo.FullName}{Path.DirectorySeparatorChar}manifest.json")) + try { - var readAllText = - File.ReadAllText($"{directoryInfo.FullName}{Path.DirectorySeparatorChar}manifest.json"); - var serialize = JsonSerializer.Deserialize(readAllText); - if (serialize != null) + if (File.Exists($"{directoryInfo.FullName}{Path.DirectorySeparatorChar}manifest.json")) { - AllPluginInfos.Add(serialize); - serialize.FullPath = $"{directoryInfo.FullName}{Path.DirectorySeparatorChar}{serialize.Main}"; - serialize.Path = $"{directoryInfo.FullName}{Path.DirectorySeparatorChar}"; - serialize.IsEnabled = false; - var (item1, versionCheckResults) = - CheckDependencies(previewList, serialize.Dependencies, - ConfigManger.Config.EnabledPluginInfos.Any(e => - e.ToPlgString() == serialize.ToPlgString())); - if (!item1) + var readAllText = + File.ReadAllText($"{directoryInfo.FullName}{Path.DirectorySeparatorChar}manifest.json"); + var serialize = JsonSerializer.Deserialize(readAllText); + if (serialize != null) { - var stringBuilder = new StringBuilder(); - foreach (var (key, value) in versionCheckResults) - stringBuilder.AppendLine($"{key} {value.ToString()}"); - - Log.Error($"加载插件{serialize.Name}时插件错误,缺失依赖\n {stringBuilder}"); - var dialog = new DialogContent() + AllPluginInfos.Add(serialize); + serialize.FullPath = $"{directoryInfo.FullName}{Path.DirectorySeparatorChar}{serialize.Main}"; + serialize.Path = $"{directoryInfo.FullName}{Path.DirectorySeparatorChar}"; + serialize.IsEnabled = false; + var (item1, versionCheckResults) = + CheckDependencies(previewList, serialize.Dependencies, + ConfigManger.Config.EnabledPluginInfos.Any(e => + e.ToPlgString() == serialize.ToPlgString())); + if (!item1) { - Title = $"加载插件{serialize.Name}时插件错误", - Content = stringBuilder, - CloseButtonText = "我知道了" - }; - ((IContentDialog)ServiceManager.Services!.GetService(typeof(IContentDialog))!).ShowDialogAsync( - null, - dialog); - continue; - } - - if (serialize.UpdateTargetVersion == 0) serialize.UpdateTargetVersion = serialize.VersionId; - if (serialize.UpdateTargetVersion != serialize.VersionId) DownloadPluginOnline(serialize).Wait(); - Log.Debug($"加载插件{serialize.Name}信息成功"); - if (ConfigManger.Config.EnabledPluginInfos.Any(e => e.ToPlgString() == serialize.ToPlgString())) - { - serialize.IsEnabled = true; - if (!PluginManager.EnablePlugin.ContainsKey(serialize.ToPlgString())){ - Task.Run(() => { Plugin.Load(serialize); }).Wait(); + var stringBuilder = new StringBuilder(); + foreach (var (key, value) in versionCheckResults) + stringBuilder.AppendLine($"{key} {value.ToString()}"); + + Log.Error($"加载插件{serialize.Name}时插件错误,缺失依赖\n {stringBuilder}"); + var dialog = new DialogContent() + { + Title = $"加载插件{serialize.Name}时插件错误", + Content = stringBuilder, + CloseButtonText = "我知道了" + }; + ((IContentDialog)ServiceManager.Services!.GetService(typeof(IContentDialog))!).ShowDialogAsync( + null, + dialog); + continue; } + + if (serialize.UpdateTargetVersion == 0) serialize.UpdateTargetVersion = serialize.VersionId; + if (serialize.UpdateTargetVersion != serialize.VersionId) DownloadPluginOnline(serialize).Wait(); + Log.Debug($"加载插件{serialize.Name}信息成功"); + if (ConfigManger.Config.EnabledPluginInfos.Any(e => e.ToPlgString() == serialize.ToPlgString())) + { + serialize.IsEnabled = true; + if (!EnablePlugin.ContainsKey(serialize.ToPlgString())){ + Task.Run(() => { Plugin.Load(serialize); }).Wait(); + } + } } } } + catch (Exception e) + { + Log.Error("错误", e); + } } Log.Debug($"加载插件信息完成共{AllPluginInfos.Count}插件被识别"); diff --git a/KitopiaAvalonia/App.axaml b/KitopiaAvalonia/App.axaml index fd45879..857d8fb 100644 --- a/KitopiaAvalonia/App.axaml +++ b/KitopiaAvalonia/App.axaml @@ -25,9 +25,7 @@ - - diff --git a/KitopiaAvalonia/KitopiaAvalonia.csproj b/KitopiaAvalonia/KitopiaAvalonia.csproj index 3cc11d1..8bc8d6b 100644 --- a/KitopiaAvalonia/KitopiaAvalonia.csproj +++ b/KitopiaAvalonia/KitopiaAvalonia.csproj @@ -68,13 +68,13 @@ - - + + - - + + diff --git a/KitopiaAvalonia/Styles/FluentUiStyles.axaml b/KitopiaAvalonia/Styles/FluentUiStyles.axaml index b30ddb6..e2160d2 100644 --- a/KitopiaAvalonia/Styles/FluentUiStyles.axaml +++ b/KitopiaAvalonia/Styles/FluentUiStyles.axaml @@ -6,6 +6,7 @@ Bold Bold 600 + 12 6 diff --git a/KitopiaEx/ImagePin/ImagePin.axaml b/KitopiaEx/ImagePin/ImagePin.axaml new file mode 100644 index 0000000..2bee6a7 --- /dev/null +++ b/KitopiaEx/ImagePin/ImagePin.axaml @@ -0,0 +1,20 @@ + + + diff --git a/KitopiaEx/ImagePin/ImagePin.axaml.cs b/KitopiaEx/ImagePin/ImagePin.axaml.cs new file mode 100644 index 0000000..d70c7e4 --- /dev/null +++ b/KitopiaEx/ImagePin/ImagePin.axaml.cs @@ -0,0 +1,34 @@ +using System; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Input; +using Avalonia.Markup.Xaml; +using Avalonia.Media.Imaging; +using Ursa.Controls; + + +namespace KitopiaEx.ImagePin; + +public partial class ImagePin : UrsaWindow +{ + public ImagePin() + { + InitializeComponent(); + } + + protected override void OnClosed(EventArgs e) + { + base.OnClosed(e); + if (Image.Source is Bitmap bitmap) + { + bitmap.Dispose(); + } + } + + private void Image_OnPointerPressed(object? sender, PointerPressedEventArgs e) + { + BeginMoveDrag(e); + } + + +} \ No newline at end of file diff --git a/KitopiaEx/ImagePin/ScreenCaptureEx.cs b/KitopiaEx/ImagePin/ScreenCaptureEx.cs new file mode 100644 index 0000000..bd4b8a0 --- /dev/null +++ b/KitopiaEx/ImagePin/ScreenCaptureEx.cs @@ -0,0 +1,53 @@ +using System; +using Avalonia; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using Avalonia.Threading; +using PluginCore; +using PluginCore.Attribute; + +namespace KitopiaEx.ImagePin; + +public class ScreenCaptureEx +{ + [Capture("置顶图片", 0xf602)] + public void Pin(ScreenCaptureResult dResult) + { + if (dResult.Bytes is null&& dResult.Source is null) + { + throw new Exception("无图像数据"); + } + + Dispatcher.UIThread.Invoke((() => + { + if (dResult.Source is null) + { + + var writeableBitmap = new WriteableBitmap( + new PixelSize(dResult.Info.Width, dResult.Info.Height), + new Vector(96, 96), PixelFormat.Bgra8888); + using (var l = writeableBitmap.Lock()) + { + unsafe + { + var destinationSizeInBytes = dResult.Info.Width * 4 * dResult.Info.Height; + fixed (byte* srcPtr = dResult.Bytes) + { + Buffer.MemoryCopy(srcPtr, (void*)l.Address, destinationSizeInBytes, destinationSizeInBytes); + } + + } + } + + dResult.Source = writeableBitmap; + + } + + var imagePin = new ImagePin(); + imagePin.Image.Source = dResult.Source; + imagePin.Width = dResult.Info.Width; + imagePin.Height = dResult.Info.Height; + imagePin.Show(); + })); + } +} \ No newline at end of file diff --git a/KitopiaEx/KitopiaEx.cs b/KitopiaEx/KitopiaEx.cs index 4abb284..d5a57e0 100644 --- a/KitopiaEx/KitopiaEx.cs +++ b/KitopiaEx/KitopiaEx.cs @@ -1,5 +1,6 @@ using System; using KitopiaEx.CustomScenarioValueSerializer; +using KitopiaEx.ImagePin; using KitopiaEx.INodeInputConnector.ScreenCaptureInfoSelfConnector; using KitopiaEx.Ocr; using Microsoft.Extensions.DependencyInjection; @@ -70,11 +71,14 @@ public static IServiceProvider GetServiceProvider() services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); + services.AddTransient(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); return services.BuildServiceProvider(); } } \ No newline at end of file diff --git a/PluginCore b/PluginCore index f711ce3..7e36ea3 160000 --- a/PluginCore +++ b/PluginCore @@ -1 +1 @@ -Subproject commit f711ce35ddd8965ff09388bf05d0c5ba1afb3fd7 +Subproject commit 7e36ea3171d52c504037e80294977be779fe5798