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
+