From 07328eea2d8991030e50fd5dc4cbb9531aeba016 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Tue, 29 Jul 2025 18:37:00 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"delete:IACore=E9=87=8A=E6=94=BE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit bfb6346812fd07d4d4cf4c46b51d25a34caad08d. --- Ink Canvas/App.xaml.cs | 11 +- Ink Canvas/Helpers/IACoreDllExtractor.cs | 168 +++++++++++++++++++++++ Ink Canvas/InkCanvasForClass.csproj | 4 + 3 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 Ink Canvas/Helpers/IACoreDllExtractor.cs diff --git a/Ink Canvas/App.xaml.cs b/Ink Canvas/App.xaml.cs index 1237f47d..299c22e5 100644 --- a/Ink Canvas/App.xaml.cs +++ b/Ink Canvas/App.xaml.cs @@ -438,7 +438,16 @@ namespace Ink_Canvas /*if (!StoreHelper.IsStoreApp) */RootPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; LogHelper.NewLog(string.Format("Ink Canvas Starting (Version: {0})", Assembly.GetExecutingAssembly().GetName().Version)); - + + // 在应用启动时自动释放IACore相关DLL + try + { + Helpers.IACoreDllExtractor.ExtractIACoreDlls(); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error); + } // 记录应用启动(设备标识符) DeviceIdentifier.RecordAppLaunch(); diff --git a/Ink Canvas/Helpers/IACoreDllExtractor.cs b/Ink Canvas/Helpers/IACoreDllExtractor.cs new file mode 100644 index 00000000..de717826 --- /dev/null +++ b/Ink Canvas/Helpers/IACoreDllExtractor.cs @@ -0,0 +1,168 @@ +using System; +using System.IO; +using System.Reflection; +using System.Windows; + +namespace Ink_Canvas.Helpers +{ + /// + /// IACore DLL自动释放器 + /// 在应用启动时自动释放IACore相关的DLL文件到应用程序目录 + /// + public static class IACoreDllExtractor + { + private static readonly string[] RequiredDlls = { + "IACore.dll", + "IALoader.dll", + "IAWinFX.dll" + }; + + /// + /// 在应用启动时释放IACore相关DLL + /// + public static void ExtractIACoreDlls() + { + try + { + string appDirectory = AppDomain.CurrentDomain.BaseDirectory; + LogHelper.WriteLogToFile("开始检查并释放IACore相关DLL文件"); + + foreach (string dllName in RequiredDlls) + { + string targetPath = Path.Combine(appDirectory, dllName); + + // 检查文件是否已存在且有效 + if (File.Exists(targetPath) && IsValidDll(targetPath)) + { + LogHelper.WriteLogToFile($"{dllName} 已存在且有效,跳过释放"); + continue; + } + + // 从嵌入资源中释放DLL + if (ExtractDllFromResource(dllName, targetPath)) + { + LogHelper.WriteLogToFile($"成功释放 {dllName} 到 {targetPath}"); + } + else + { + LogHelper.WriteLogToFile($"警告:无法释放 {dllName},可能影响形状识别功能", LogHelper.LogType.Warning); + } + } + + LogHelper.WriteLogToFile("IACore DLL释放检查完成"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"释放IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + + /// + /// 从嵌入资源中提取DLL文件 + /// + private static bool ExtractDllFromResource(string dllName, string targetPath) + { + try + { + Assembly assembly = Assembly.GetExecutingAssembly(); + string resourceName = $"Ink_Canvas.Resources.IACore.{dllName}"; + + using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName)) + { + if (resourceStream == null) + { + LogHelper.WriteLogToFile($"未找到嵌入资源: {resourceName}", LogHelper.LogType.Warning); + return false; + } + + // 确保目标目录存在 + string targetDirectory = Path.GetDirectoryName(targetPath); + if (!Directory.Exists(targetDirectory)) + { + Directory.CreateDirectory(targetDirectory); + } + + // 写入文件 + using (FileStream fileStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) + { + resourceStream.CopyTo(fileStream); + } + + return true; + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"从资源提取 {dllName} 失败: {ex.Message}", LogHelper.LogType.Error); + return false; + } + } + + /// + /// 检查DLL文件是否有效 + /// + private static bool IsValidDll(string filePath) + { + try + { + if (!File.Exists(filePath)) + return false; + + FileInfo fileInfo = new FileInfo(filePath); + + // 检查文件大小(空文件或过小的文件可能无效) + if (fileInfo.Length < 1024) // 小于1KB可能无效 + return false; + + // 简单检查PE头(DLL文件应该以MZ开头) + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) + { + byte[] buffer = new byte[2]; + if (fs.Read(buffer, 0, 2) == 2) + { + return buffer[0] == 0x4D && buffer[1] == 0x5A; // "MZ" + } + } + + return false; + } + catch + { + return false; + } + } + + /// + /// 清理释放的DLL文件(可选,在应用退出时调用) + /// + public static void CleanupExtractedDlls() + { + try + { + string appDirectory = AppDomain.CurrentDomain.BaseDirectory; + + foreach (string dllName in RequiredDlls) + { + string filePath = Path.Combine(appDirectory, dllName); + + if (File.Exists(filePath)) + { + try + { + File.Delete(filePath); + LogHelper.WriteLogToFile($"已清理 {dllName}"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清理 {dllName} 失败: {ex.Message}", LogHelper.LogType.Warning); + } + } + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"清理IACore DLL时出错: {ex.Message}", LogHelper.LogType.Error); + } + } + } +} diff --git a/Ink Canvas/InkCanvasForClass.csproj b/Ink Canvas/InkCanvasForClass.csproj index 31ad10da..43d18efc 100644 --- a/Ink Canvas/InkCanvasForClass.csproj +++ b/Ink Canvas/InkCanvasForClass.csproj @@ -143,6 +143,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive +