diff --git a/UntamedMusicPlayer/App.xaml.cs b/UntamedMusicPlayer/App.xaml.cs index a291471..3a2ffaa 100644 --- a/UntamedMusicPlayer/App.xaml.cs +++ b/UntamedMusicPlayer/App.xaml.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging; using Microsoft.UI.Xaml; using UntamedMusicPlayer.Activation; using UntamedMusicPlayer.Contracts.Services; +using UntamedMusicPlayer.Helpers; using UntamedMusicPlayer.Models; using UntamedMusicPlayer.Services; using UntamedMusicPlayer.ViewModels; @@ -47,6 +48,9 @@ public sealed partial class App : Application // 初始化日志服务(必须在任何日志记录之前) LoggingService.Initialize(); + // 初始化 MemoryPack 格式化器(用于 AOT 支持) + MemoryPackAotHelper.RegisterFormatters(); + Host = Microsoft .Extensions.Hosting.Host.CreateDefaultBuilder() .UseContentRoot(AppContext.BaseDirectory) diff --git a/UntamedMusicPlayer/Helpers/MemoryPackAotHelper.cs b/UntamedMusicPlayer/Helpers/MemoryPackAotHelper.cs new file mode 100644 index 0000000..c068732 --- /dev/null +++ b/UntamedMusicPlayer/Helpers/MemoryPackAotHelper.cs @@ -0,0 +1,66 @@ +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using MemoryPack; +using MemoryPack.Formatters; +using UntamedMusicPlayer.Contracts.Models; +using UntamedMusicPlayer.Models; +using UntamedMusicPlayer.OnlineAPIs.CloudMusicAPI; +using UntamedMusicPlayer.Playback; + +namespace UntamedMusicPlayer.Helpers; + +public class MemoryPackAotHelper +{ + public static void RegisterFormatters() + { + // 为 [MemoryPackable] 类型显式注册 MemoryPackableFormatter 以支持 NativeAOT + // 这样可以避开 MemoryPack 内部探测时使用的反射(容易因 NativeAOT 裁剪而失败) + Register(); + Register(); + Register(); + Register(); + Register(); + Register(); + Register(); + Register(); + + // 接口类型特殊处理 + RuntimeHelpers.RunClassConstructor(typeof(IBriefSongInfoBase).TypeHandle); + + // 显式注册集合类型格式化器,以解决 NativeAOT 中的反射和修剪问题 + MemoryPackFormatterProvider.Register(new ConcurrentBagFormatter()); + MemoryPackFormatterProvider.Register( + new ConcurrentDictionaryFormatter() + ); + MemoryPackFormatterProvider.Register( + new ConcurrentDictionaryFormatter() + ); + MemoryPackFormatterProvider.Register(new ConcurrentDictionaryFormatter()); + MemoryPackFormatterProvider.Register( + new ObservableCollectionFormatter() + ); + MemoryPackFormatterProvider.Register( + new ObservableCollectionFormatter() + ); + MemoryPackFormatterProvider.Register(new ListFormatter()); + MemoryPackFormatterProvider.Register(new ListFormatter()); + MemoryPackFormatterProvider.Register(new DictionaryFormatter()); + MemoryPackFormatterProvider.Register(new HashSetFormatter()); + } + + [UnconditionalSuppressMessage( + "Trimming", + "IL2059", + Justification = "T is annotated with DynamicallyAccessedMembers(All) which preserves the static constructor." + )] + private static void Register< + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T + >() + where T : class, IMemoryPackable + { + // 运行静态构造函数以激活内部注册逻辑 + RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle); + // 同时提供显式格式化器以防万一 + MemoryPackFormatterProvider.Register(new MemoryPackableFormatter()); + } +} diff --git a/UntamedMusicPlayer/Models/FileManager.cs b/UntamedMusicPlayer/Models/FileManager.cs index 8a33d0c..c77bce7 100644 --- a/UntamedMusicPlayer/Models/FileManager.cs +++ b/UntamedMusicPlayer/Models/FileManager.cs @@ -41,8 +41,7 @@ public static class FileManager try { // 创建音乐库数据目录 - var localFolder = ApplicationData.Current.LocalFolder; - var libraryFolder = await localFolder.CreateFolderAsync( + var libraryFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "LibraryData", CreationCollisionOption.OpenIfExists ); @@ -98,8 +97,7 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; - var playQueueFolder = await localFolder.CreateFolderAsync( + var playQueueFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "PlayQueueData", CreationCollisionOption.OpenIfExists ); @@ -128,8 +126,7 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; - var playlistFolder = await localFolder.CreateFolderAsync( + var playlistFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "PlaylistData", CreationCollisionOption.OpenIfExists ); @@ -149,8 +146,7 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; - var playlistFolder = await localFolder.CreateFolderAsync( + var playlistFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync( "PlaylistM3u8Data", CreationCollisionOption.OpenIfExists ); @@ -185,18 +181,16 @@ public static class FileManager try { - // 获取本地文件夹 - var localFolder = ApplicationData.Current.LocalFolder; - // 尝试打开音乐库数据目录 StorageFolder libraryFolder; try { - libraryFolder = await localFolder.GetFolderAsync("LibraryData"); + libraryFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync( + "LibraryData" + ); } - catch + catch // 文件夹不存在,需要重新扫描 { - // 文件夹不存在,需要重新扫描 return (true, data); } @@ -295,11 +289,12 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; StorageFolder playQueueFolder; try { - playQueueFolder = await localFolder.GetFolderAsync("PlayQueueData"); + playQueueFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync( + "PlayQueueData" + ); } catch { @@ -335,11 +330,12 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; StorageFolder playlistFolder; try { - playlistFolder = await localFolder.GetFolderAsync("PlaylistData"); + playlistFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync( + "PlaylistData" + ); } catch { @@ -366,8 +362,18 @@ public static class FileManager { try { - var localFolder = ApplicationData.Current.LocalFolder; - var playlistFolder = await localFolder.GetFolderAsync("PlaylistM3u8Data"); + StorageFolder playlistFolder; + try + { + playlistFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync( + "PlaylistM3u8Data" + ); + } + catch + { + return []; + } + var files = await playlistFolder.GetFilesAsync(); var playlists = new List(); foreach (var file in files) diff --git a/UntamedMusicPlayer/Package.appxmanifest b/UntamedMusicPlayer/Package.appxmanifest index 83ae7af..7541151 100644 --- a/UntamedMusicPlayer/Package.appxmanifest +++ b/UntamedMusicPlayer/Package.appxmanifest @@ -11,8 +11,8 @@ + Publisher="CN=Admin" + Version="0.5.5.0" /> diff --git a/UntamedMusicPlayer/Properties/PublishProfiles/win-arm64.pubxml b/UntamedMusicPlayer/Properties/PublishProfiles/win-arm64.pubxml index 6a4e01e..362bc05 100644 --- a/UntamedMusicPlayer/Properties/PublishProfiles/win-arm64.pubxml +++ b/UntamedMusicPlayer/Properties/PublishProfiles/win-arm64.pubxml @@ -1,11 +1,16 @@ - - FileSystem - arm64 - win-arm64 - bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - True - False - + + FileSystem + arm64 + win-arm64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + False + + + + PreserveNewest + %(Filename)%(Extension) + + diff --git a/UntamedMusicPlayer/Properties/PublishProfiles/win-x64.pubxml b/UntamedMusicPlayer/Properties/PublishProfiles/win-x64.pubxml index d588b65..95dd4b6 100644 --- a/UntamedMusicPlayer/Properties/PublishProfiles/win-x64.pubxml +++ b/UntamedMusicPlayer/Properties/PublishProfiles/win-x64.pubxml @@ -1,11 +1,16 @@ - - FileSystem - x64 - win-x64 - bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - True - False - + + FileSystem + x64 + win-x64 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + False + + + + PreserveNewest + %(Filename)%(Extension) + + diff --git a/UntamedMusicPlayer/Properties/PublishProfiles/win-x86.pubxml b/UntamedMusicPlayer/Properties/PublishProfiles/win-x86.pubxml index 5000efc..15bbac9 100644 --- a/UntamedMusicPlayer/Properties/PublishProfiles/win-x86.pubxml +++ b/UntamedMusicPlayer/Properties/PublishProfiles/win-x86.pubxml @@ -1,11 +1,16 @@ - - FileSystem - x86 - win-x86 - bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ - True - False - + + FileSystem + x86 + win-x86 + bin\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\publish\ + False + + + + PreserveNewest + %(Filename)%(Extension) + + diff --git a/UntamedMusicPlayer/UntamedMusicPlayer.csproj b/UntamedMusicPlayer/UntamedMusicPlayer.csproj index 572f79a..ccbeca2 100644 --- a/UntamedMusicPlayer/UntamedMusicPlayer.csproj +++ b/UntamedMusicPlayer/UntamedMusicPlayer.csproj @@ -1,106 +1,86 @@ - - WinExe - net10.0-windows10.0.26100.0 - 10.0.19041.0 - UntamedMusicPlayer - Assets/AppIcon/Icon.ico - app.manifest - x86;x64;arm64 - win-x86;win-x64;win-arm64 - win-$(Platform).pubxml - True - enable - enable - True - preview - - - - - PreserveNewest - - - PreserveNewest - - - - - PreserveNewest - %(Filename)%(Extension) - - - - - PreserveNewest - %(Filename)%(Extension) - - - - - PreserveNewest - %(Filename)%(Extension) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - - - - ResXFileCodeGenerator - - - - - en-us - x86|x64|arm64 - True - True - True - True - - True - True - True - UntamedMusicPlayer_TemporaryKey.pfx - False - SHA256 - True - False - True - False - Never - + + WinExe + net10.0-windows10.0.26100.0 + 10.0.19041.0 + UntamedMusicPlayer + Assets/AppIcon/Icon.ico + app.manifest + x86;x64;arm64 + win-x86;win-x64;win-arm64 + win-$(Platform).pubxml + True + enable + enable + True + preview + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + + + + ResXFileCodeGenerator + + + + + en-us + x86|x64|arm64 + True + True + True + True + True + True + True + UntamedMusicPlayer_TemporaryKey.pfx + True + SHA256 + False + False + True + False + Never +