From e1b93f8a7e00ea8efb184631fabadf7caec11b37 Mon Sep 17 00:00:00 2001 From: micha102 Date: Thu, 16 Apr 2026 12:29:14 +0700 Subject: [PATCH] Add Windows ARM64 native library loading with x64 fallback --- src/LibVLCSharp/Shared/Core/Constants.cs | 1 + src/LibVLCSharp/Shared/Core/Core.cs | 35 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/LibVLCSharp/Shared/Core/Constants.cs b/src/LibVLCSharp/Shared/Core/Constants.cs index d1d71abc7..25127e167 100644 --- a/src/LibVLCSharp/Shared/Core/Constants.cs +++ b/src/LibVLCSharp/Shared/Core/Constants.cs @@ -30,6 +30,7 @@ internal static class Constants internal static class ArchitectureNames { + internal const string WinArm64 = "win-arm64"; internal const string Win64 = "win-x64"; internal const string Win86 = "win-x86"; internal const string MacOS64 = "osx-x64"; diff --git a/src/LibVLCSharp/Shared/Core/Core.cs b/src/LibVLCSharp/Shared/Core/Core.cs index 7db23b0f3..2afe65989 100644 --- a/src/LibVLCSharp/Shared/Core/Core.cs +++ b/src/LibVLCSharp/Shared/Core/Core.cs @@ -77,6 +77,20 @@ static internal bool LibVLCLoaded { arch = Path.Combine(ArchitectureNames.MacOS64, Constants.Lib); } + +#if !NET40 && !NETSTANDARD1_1 + else if (PlatformHelper.IsWindows) + { + arch = RuntimeInformation.ProcessArchitecture switch + { + Architecture.X64 => ArchitectureNames.Win64, + Architecture.X86 => ArchitectureNames.Win86, + Architecture.Arm64 => ArchitectureNames.WinArm64, + _ => PlatformHelper.IsX64BitProcess ? ArchitectureNames.Win64 : ArchitectureNames.Win86 + }; + } +#endif + else { arch = PlatformHelper.IsX64BitProcess ? ArchitectureNames.Win64 : ArchitectureNames.Win86; @@ -124,6 +138,27 @@ static internal bool LibVLCLoaded paths.Add((string.Empty, libvlcPath3)); + // Add Win64 folders as fallback for WinArm64 to keep compatibility + if (arch == ArchitectureNames.WinArm64) + { + var fallbackLibvlcDirPath1 = Path.Combine(Path.GetDirectoryName(libvlcAssemblyLocation)!, + Constants.LibrariesRepositoryFolderName, ArchitectureNames.Win64); + + var fallbackLibvlccorePath1 = LibVLCCorePath(fallbackLibvlcDirPath1); + var fallbackLibvlcPath1 = LibVLCPath(fallbackLibvlcDirPath1); + paths.Add((fallbackLibvlccorePath1, fallbackLibvlcPath1)); + + if (!string.IsNullOrEmpty(assemblyLocation)) + { + var fallbackLibvlcDirPath2 = Path.Combine(Path.GetDirectoryName(assemblyLocation)!, + Constants.LibrariesRepositoryFolderName, ArchitectureNames.Win64); + + var fallbackLibvlccorePath2 = LibVLCCorePath(fallbackLibvlcDirPath2); + var fallbackLibvlcPath2 = LibVLCPath(fallbackLibvlcDirPath2); + paths.Add((fallbackLibvlccorePath2, fallbackLibvlcPath2)); + } + } + if (PlatformHelper.IsMac) { var libvlcPath4 = Path.Combine(Path.Combine(Path.GetDirectoryName(libvlcAssemblyLocation)!,