From 91141b29bcbf382635d138d29101467cb206962f Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 22 Feb 2022 16:49:59 +0000 Subject: [PATCH 1/4] Use RuntimeInformation to determine the Processor architecture. See https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=net-6.0 Now that we ship an arm based native library on windows we need to be able to determine the underlying library to load. We can use the `RuntimeInformation.ProcessArchitecture` value to get this data. Then based on that we can load from `x86`, `x64` or `arm64` subdirectories. Note we will still fallback to loading from the current directory , but the preference is to load from on of the architecture specific sub directories. --- LibZipSharp/Xamarin.LibZipSharp.targets | 6 +++--- LibZipSharp/Xamarin.Tools.Zip/Native.cs | 8 +++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/LibZipSharp/Xamarin.LibZipSharp.targets b/LibZipSharp/Xamarin.LibZipSharp.targets index 533120ff..2a2f9b11 100644 --- a/LibZipSharp/Xamarin.LibZipSharp.targets +++ b/LibZipSharp/Xamarin.LibZipSharp.targets @@ -4,13 +4,13 @@ <_LibZipNativeLibs Include="$(MSBuildThisFileDirectory)..\runtimes\win-x64\native\libZipSharpNative.*"> - lib64\%(FileName)%(Extension) + x64\%(FileName)%(Extension) <_LibZipNativeLibs Include="$(MSBuildThisFileDirectory)..\runtimes\win-arm64\native\libZipSharpNative.*"> - %(FileName)%(Extension) + arm64\%(FileName)%(Extension) <_LibZipNativeLibs Include="$(MSBuildThisFileDirectory)..\runtimes\win-x86\native\libZipSharpNative.*"> - %(FileName)%(Extension) + x86\%(FileName)%(Extension) <_LibZipNativeLibs Include="$(MSBuildThisFileDirectory)..\runtimes\osx\native\libZipSharpNative.dylib"> %(FileName)%(Extension) diff --git a/LibZipSharp/Xamarin.Tools.Zip/Native.cs b/LibZipSharp/Xamarin.Tools.Zip/Native.cs index a0e4b05a..ee2a16b7 100644 --- a/LibZipSharp/Xamarin.Tools.Zip/Native.cs +++ b/LibZipSharp/Xamarin.Tools.Zip/Native.cs @@ -455,7 +455,13 @@ static Native () { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { string executingDirectory = System.IO.Path.GetDirectoryName (typeof(Native).Assembly.Location); - SetDllDirectory (Environment.Is64BitProcess ? System.IO.Path.Combine (executingDirectory, "lib64") : executingDirectory); + string arch = RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); + string path = System.IO.Path.Combine (executingDirectory, arch); + if (System.IO.Directory.Exists (path)) { + SetDllDirectory (path); + return; + } + SetDllDirectory (executingDirectory); } } } From 6b3cb2826def8fbaaeac8d6918c396011bbd2c61 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 22 Feb 2022 17:41:53 +0000 Subject: [PATCH 2/4] Fix build error --- LibZipSharp/Xamarin.Tools.Zip/Native.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/LibZipSharp/Xamarin.Tools.Zip/Native.cs b/LibZipSharp/Xamarin.Tools.Zip/Native.cs index ee2a16b7..f0402416 100644 --- a/LibZipSharp/Xamarin.Tools.Zip/Native.cs +++ b/LibZipSharp/Xamarin.Tools.Zip/Native.cs @@ -455,6 +455,7 @@ static Native () { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { string executingDirectory = System.IO.Path.GetDirectoryName (typeof(Native).Assembly.Location); + #if !NET45 string arch = RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); string path = System.IO.Path.Combine (executingDirectory, arch); if (System.IO.Directory.Exists (path)) { @@ -462,6 +463,9 @@ static Native () return; } SetDllDirectory (executingDirectory); + #else + SetDllDirectory (Environment.Is64BitProcess ? System.IO.Path.Combine (executingDirectory, "x64") : executingDirectory); + #endif } } } From 348a3ae2618fa9cb93f6208cc4fd417a9cb27006 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Tue, 22 Feb 2022 20:02:11 +0000 Subject: [PATCH 3/4] Use a different path for net45 --- LibZipSharp/Xamarin.Tools.Zip/Native.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/LibZipSharp/Xamarin.Tools.Zip/Native.cs b/LibZipSharp/Xamarin.Tools.Zip/Native.cs index f0402416..f5318ef1 100644 --- a/LibZipSharp/Xamarin.Tools.Zip/Native.cs +++ b/LibZipSharp/Xamarin.Tools.Zip/Native.cs @@ -458,14 +458,14 @@ static Native () #if !NET45 string arch = RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); string path = System.IO.Path.Combine (executingDirectory, arch); + #else + string path = System.IO.Path.Combine (executingDirectory, Environment.Is64BitProcess ? "x64" : "x86")); + #endif if (System.IO.Directory.Exists (path)) { SetDllDirectory (path); return; } SetDllDirectory (executingDirectory); - #else - SetDllDirectory (Environment.Is64BitProcess ? System.IO.Path.Combine (executingDirectory, "x64") : executingDirectory); - #endif } } } From 181209e3105b9e686d0fb07dcffdb34f66112ef2 Mon Sep 17 00:00:00 2001 From: Dean Ellis Date: Wed, 23 Feb 2022 09:40:41 +0000 Subject: [PATCH 4/4] fix typo --- LibZipSharp/Xamarin.Tools.Zip/Native.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibZipSharp/Xamarin.Tools.Zip/Native.cs b/LibZipSharp/Xamarin.Tools.Zip/Native.cs index f5318ef1..8962af8a 100644 --- a/LibZipSharp/Xamarin.Tools.Zip/Native.cs +++ b/LibZipSharp/Xamarin.Tools.Zip/Native.cs @@ -459,7 +459,7 @@ static Native () string arch = RuntimeInformation.ProcessArchitecture.ToString ().ToLower (); string path = System.IO.Path.Combine (executingDirectory, arch); #else - string path = System.IO.Path.Combine (executingDirectory, Environment.Is64BitProcess ? "x64" : "x86")); + string path = System.IO.Path.Combine (executingDirectory, Environment.Is64BitProcess ? "x64" : "x86"); #endif if (System.IO.Directory.Exists (path)) { SetDllDirectory (path);