diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e246aa8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,46 @@ + +## THE EXTRA PACKAGES ADDED DURING BUILD ARE NECESSARY FOR THE NATIVE LIB LIBRARY TO SUCCEED +## THIS IS THE FIX TO ALLOW THIS LIB TO WORK +## WHILST https://github.com/mellinoe/nativelibraryloader/issues/2 is open +## AND WHILE https://github.com/dotnet/corefx/issues/32015 is open +#ENV LD_DEBUG=all can be used to see the full error (if the package management isnt used) + + +### BUILD IN ALPINE - TESTED PASSED +FROM microsoft/dotnet:2.2-sdk-alpine3.8 AS alpine +#zstd-libs in apk is 1.3.4 +RUN apk add --no-cache libc6-compat +ENV ALPINE=TRUE +WORKDIR /src +COPY ./ ./ +RUN ls /src/Zstandard.Net.Tests/bin/ + +RUN dotnet test + + +### BUILD IN STRETCH - TESTED PASSED +### Note: MSFT default image "sdk" is stretch https://github.com/dotnet/dotnet-docker +FROM microsoft/dotnet:2.2-sdk-stretch AS stretch + +# Installing the lib is pointless as its 1.2 and fails the dictionary tests +RUN apt-get update \ + && apt-get install -y --no-install-recommends libc6-dev + +WORKDIR /src +COPY ./ ./ + +RUN dotnet test + + +### BUILD IN bionic - TESTED PASSED +FROM microsoft/dotnet:2.2-sdk-bionic AS bionic + +# libzstd1 is 1.3.3 which passes the tests +RUN apt-get update \ + && apt-get install -y --no-install-recommends libc6-dev + +WORKDIR /src +COPY ./ ./ + +RUN dotnet test + diff --git a/Dockerfile.md b/Dockerfile.md new file mode 100644 index 0000000..9b03d22 --- /dev/null +++ b/Dockerfile.md @@ -0,0 +1,47 @@ +# Using Docker instances + +This is showing the SDK, you'd want to use the runtime for most things. + +``` +FROM microsoft/dotnet:2.2-sdk-alpine3.8 AS alpine + +# This is required for libld to load the package +# The copying moves the libzstd to the standard library location +RUN apk add --no-cache libc6-compat && \ + cp linuxalpine/libzstd.so /usr/lib/ + +WORKDIR /src +COPY ./ ./ + +# Entry point etc +``` + +``` +### Note: MSFT default image "sdk" is stretch https://github.com/dotnet/dotnet-docker +FROM microsoft/dotnet:2.2-sdk-stretch AS stretch + +# Installing the lib is pointless as its 1.2 and fails the dictionary tests +RUN apt-get update \ + && apt-get install -y --no-install-recommends libc6-dev \ + && cp linuxdebian/libzstd.so /usr/lib/ + +WORKDIR /src +COPY ./ ./ + +# Entry point etc +``` + +``` +### bionic +FROM microsoft/dotnet:2.2-sdk-bionic AS bionic + +# libzstd1 is 1.3.3 which passes the tests +RUN apt-get update \ + && apt-get install -y --no-install-recommends libc6-dev \ + && cp linuxdebian/libzstd.so /usr/lib/ + +WORKDIR /src +COPY ./ ./ + +# Entry point etc +``` diff --git a/README.md b/README.md index fbd9fb1..6d681bf 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,33 @@ Download the library from NuGet: https://www.nuget.org/packages/Zstandard.Net/ + + +## Building ZStd binaries + +It's usually best to create the binaries within a container or vm of the same type of OS, mapping the zstd (facebook repo) to the instance (or checking out within the image, but you'll need to map a local folder to copy the files out). + +### For alpine + +```dockerfile +FROM alpine:3.8 + +RUN apk --no-cache add make gcc libc-dev +COPY . /src +RUN mkdir /pkg && cd /src && make && make DESTDIR=/pkg install + +``` + +* `docker build -t tmpzstd .` +* `docker run --rm -it -v I:\Zstandard.Net\zstd:/wrk tmpzstd ` + + + +### For Debian & Windows + +The makefile can be ran from WSL (ubuntu) and will generate a debian compatible library. + +For Windows you'll need VS installed; once installed you simply run the command that matches your version in `zstd\build\VS_scripts` the dll is deposited in the bin/release/x64 folder. + + + diff --git a/Zstandard.Net.Benchmark/Program.cs b/Zstandard.Net.Benchmark/Program.cs index dddf2a1..6120e0f 100644 --- a/Zstandard.Net.Benchmark/Program.cs +++ b/Zstandard.Net.Benchmark/Program.cs @@ -6,7 +6,7 @@ namespace Zstandard.Net.Benchmark { - class Program + static class Program { static void Main(string[] args) { diff --git a/Zstandard.Net.Benchmark/Zstandard.Net.Benchmark.csproj b/Zstandard.Net.Benchmark/Zstandard.Net.Benchmark.csproj index 7c9cb2e..8abbdd3 100644 --- a/Zstandard.Net.Benchmark/Zstandard.Net.Benchmark.csproj +++ b/Zstandard.Net.Benchmark/Zstandard.Net.Benchmark.csproj @@ -1,16 +1,12 @@ - + Exe - netcoreapp2.0 + netcoreapp2.2 + Debug;Release;Sandbox + false - - - ..\..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.1\build\netstandard2.0\ref\netstandard.dll - - - PreserveNewest diff --git a/Zstandard.Net.Sandbox/App.config b/Zstandard.Net.Sandbox/App.config index 88fa402..8fc0551 100644 --- a/Zstandard.Net.Sandbox/App.config +++ b/Zstandard.Net.Sandbox/App.config @@ -1,6 +1,6 @@ - + - + - \ No newline at end of file + diff --git a/Zstandard.Net.Sandbox/Program.cs b/Zstandard.Net.Sandbox/Program.cs index 58cb89c..2ca89fb 100644 --- a/Zstandard.Net.Sandbox/Program.cs +++ b/Zstandard.Net.Sandbox/Program.cs @@ -6,7 +6,7 @@ namespace Zstandard.Net.Sandbox { - class Program + static class Program { static void Main(string[] args) { diff --git a/Zstandard.Net.Sandbox/Zstandard.Net.Sandbox.csproj b/Zstandard.Net.Sandbox/Zstandard.Net.Sandbox.csproj index e78ed95..a731651 100644 --- a/Zstandard.Net.Sandbox/Zstandard.Net.Sandbox.csproj +++ b/Zstandard.Net.Sandbox/Zstandard.Net.Sandbox.csproj @@ -8,9 +8,10 @@ Exe Zstandard.Net.Sandbox Zstandard.Net.Sandbox - v4.5.2 + v4.7.1 512 true + false AnyCPU @@ -32,6 +33,16 @@ prompt 4 + + bin\Sandbox\ + TRACE + true + pdbonly + AnyCPU + prompt + MinimumRecommendedRules.ruleset + true + diff --git a/Zstandard.Net.Tests/GlobalSuppressions.cs b/Zstandard.Net.Tests/GlobalSuppressions.cs new file mode 100644 index 0000000..9911ec5 --- /dev/null +++ b/Zstandard.Net.Tests/GlobalSuppressions.cs @@ -0,0 +1,8 @@ + +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "SecurityIntelliSenseCS:MS Security rules violation", Justification = "", Scope = "member", Target = "~M:Zstandard.Net.Tests.StandardTests.GetRandomData(System.Int32)~System.Byte[]")] +[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "SecurityIntelliSenseCS:MS Security rules violation", Justification = "", Scope = "member", Target = "~M:Zstandard.Net.Tests.DictionaryTests.GetRandomData(System.Int32)~System.Byte[]")] \ No newline at end of file diff --git a/Zstandard.Net.Tests/PropertyTests.cs b/Zstandard.Net.Tests/PropertyTests.cs index 672f3a7..fcb6ed3 100644 --- a/Zstandard.Net.Tests/PropertyTests.cs +++ b/Zstandard.Net.Tests/PropertyTests.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System; +using System.IO; namespace Zstandard.Net.Tests { diff --git a/Zstandard.Net.Tests/StandardTests.cs b/Zstandard.Net.Tests/StandardTests.cs index f5e53b0..76a90db 100644 --- a/Zstandard.Net.Tests/StandardTests.cs +++ b/Zstandard.Net.Tests/StandardTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.IO.Compression; using System.Linq; +using System.Runtime.InteropServices; namespace Zstandard.Net.Tests { diff --git a/Zstandard.Net.Tests/Zstandard.Net.Tests.csproj b/Zstandard.Net.Tests/Zstandard.Net.Tests.csproj index ea5fa0e..15cf799 100644 --- a/Zstandard.Net.Tests/Zstandard.Net.Tests.csproj +++ b/Zstandard.Net.Tests/Zstandard.Net.Tests.csproj @@ -1,7 +1,9 @@ - + - netcoreapp2.0;net45 + netcoreapp2.2 + Debug;Release;Sandbox + true @@ -20,6 +22,27 @@ + + true + + + + true + true + + + + + + + + + + + + + + PreserveNewest diff --git a/Zstandard.Net.sln b/Zstandard.Net.sln index 25dd4aa..1bf634b 100644 --- a/Zstandard.Net.sln +++ b/Zstandard.Net.sln @@ -9,30 +9,37 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Zstandard.Net.Tests", "Zsta EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zstandard.Net.Sandbox", "Zstandard.Net.Sandbox\Zstandard.Net.Sandbox.csproj", "{2F3734C8-67F5-42C4-BEE3-BCA10285E310}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Zstandard.Net.Benchmark", "Zstandard.Net.Benchmark\Zstandard.Net.Benchmark.csproj", "{7273C9EE-8EBD-466B-8AC7-FFC830D15E19}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Zstandard.Net.Benchmark", "Zstandard.Net.Benchmark\Zstandard.Net.Benchmark.csproj", "{7273C9EE-8EBD-466B-8AC7-FFC830D15E19}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU + Sandbox|Any CPU = Sandbox|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {054BA829-FE7C-476C-A335-FB8CCB552F05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {054BA829-FE7C-476C-A335-FB8CCB552F05}.Debug|Any CPU.Build.0 = Debug|Any CPU {054BA829-FE7C-476C-A335-FB8CCB552F05}.Release|Any CPU.ActiveCfg = Release|Any CPU {054BA829-FE7C-476C-A335-FB8CCB552F05}.Release|Any CPU.Build.0 = Release|Any CPU + {054BA829-FE7C-476C-A335-FB8CCB552F05}.Sandbox|Any CPU.ActiveCfg = Sandbox|Any CPU + {054BA829-FE7C-476C-A335-FB8CCB552F05}.Sandbox|Any CPU.Build.0 = Sandbox|Any CPU {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Debug|Any CPU.Build.0 = Debug|Any CPU {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Release|Any CPU.ActiveCfg = Release|Any CPU {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Release|Any CPU.Build.0 = Release|Any CPU + {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Sandbox|Any CPU.ActiveCfg = Sandbox|Any CPU + {5623F4A5-9E4D-4BB7-BB46-9B50CC291321}.Sandbox|Any CPU.Build.0 = Sandbox|Any CPU {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Debug|Any CPU.Build.0 = Debug|Any CPU {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Release|Any CPU.Build.0 = Release|Any CPU + {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Sandbox|Any CPU.ActiveCfg = Sandbox|Any CPU + {2F3734C8-67F5-42C4-BEE3-BCA10285E310}.Sandbox|Any CPU.Build.0 = Sandbox|Any CPU {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Debug|Any CPU.Build.0 = Debug|Any CPU {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Release|Any CPU.ActiveCfg = Release|Any CPU {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Release|Any CPU.Build.0 = Release|Any CPU + {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Sandbox|Any CPU.ActiveCfg = Sandbox|Any CPU + {7273C9EE-8EBD-466B-8AC7-FFC830D15E19}.Sandbox|Any CPU.Build.0 = Sandbox|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Zstandard.Net/Zstandard.Net.csproj b/Zstandard.Net/Zstandard.Net.csproj index fe97d1f..48dd3bc 100644 --- a/Zstandard.Net/Zstandard.Net.csproj +++ b/Zstandard.Net/Zstandard.Net.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net45 + netstandard2.0 Zstandard.Net true bp74 @@ -11,28 +11,42 @@ https://github.com/bp74/Zstandard.Net/blob/master/LICENSE https://github.com/bp74/Zstandard.Net Compression Stream Zstandard Zstd - fixed unmanaged resource leak - - 1.1.7 + Added alpine and nix build of libzstd, added NativeLibraryLoader to resolve on nix/docker + 1.2.6 + Debug;Release;Sandbox + false + fixed unmanaged resource leak - - - x64\%(FileName)%(Extension) - PreserveNewest - - - x86\%(FileName)%(Extension) - PreserveNewest - - - - - - - - - - + + + + + + + win-x64\%(FileName)%(Extension) + Always + true + + + win-x86\%(FileName)%(Extension) + Always + true + + + linuxdebian\%(FileName)%(Extension) + Always + true + + + linuxalpine\%(FileName)%(Extension) + Always + true + + + + + + diff --git a/Zstandard.Net/ZstandardInterop.cs b/Zstandard.Net/ZstandardInterop.cs index 348e993..83cdd6a 100644 --- a/Zstandard.Net/ZstandardInterop.cs +++ b/Zstandard.Net/ZstandardInterop.cs @@ -1,19 +1,124 @@ using System; using System.IO; +using System.Linq; +using System.Reflection; using System.Runtime.InteropServices; namespace Zstandard.Net { + internal static class Kernel32 + { + //https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-loadlibraryexa + + [Flags] + public enum LoadLibraryFlags : uint + { + DONT_RESOLVE_DLL_REFERENCES = 0x00000001, + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, + LOAD_LIBRARY_AS_DATAFILE = 0x00000002, + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, + LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200, + LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000, + LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100, + LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800, + LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400, + LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 + } + + [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] + public static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); + + [DllImport("kernel32")] + public static extern IntPtr GetProcAddress(IntPtr module, string procName); + + [DllImport("kernel32")] + public static extern int FreeLibrary(IntPtr module); + } + + internal static class Libdl + { + private const string LibName = "libdl.so"; + + public const int RTLD_NOW = 2; + + [DllImport(LibName)] + public static extern IntPtr dlopen(string fileName, int flags); + + [DllImport(LibName)] + public static extern IntPtr dlsym(IntPtr handle, string name); + + [DllImport(LibName)] + public static extern int dlclose(IntPtr handle); + + [DllImport(LibName)] + public static extern IntPtr dlerror(); + } + internal static class ZstandardInterop { static ZstandardInterop() { - if (Environment.OSVersion.Platform == PlatformID.Win32NT) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - var root = Path.GetDirectoryName(typeof(ZstandardInterop).Assembly.Location); - var path = Environment.Is64BitProcess ? "x64" : "x86"; + var root = AppContext.BaseDirectory;//Path.GetDirectoryName(typeof(ZstandardInterop).Assembly.Location); + var path = RuntimeInformation.ProcessArchitecture == Architecture.X64 ? "win-x64" : "win-x86"; var file = Path.Combine(root, path, "libzstd.dll"); - LoadLibraryEx(file, IntPtr.Zero, LoadLibraryFlags.LOAD_LIBRARY_SEARCH_APPLICATION_DIR); + + if (!File.Exists(file)) + { + throw new FileNotFoundException("Couldn't Load ZSTD lib", file); + } + + Kernel32.LoadLibraryEx(file, IntPtr.Zero, Kernel32.LoadLibraryFlags.LOAD_LIBRARY_SEARCH_APPLICATION_DIR); + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && RuntimeInformation.ProcessArchitecture == Architecture.X64) + { + string rootDirectory = AppDomain.CurrentDomain.BaseDirectory; + string assemblyDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + var isOsx = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + + string libFile = isOsx ? "libzstd.dylib" : "libzstd.so"; + // https://docs.microsoft.com/en-us/dotnet/core/rid-catalog + string arch = (isOsx ? "osx" : "linux") /*+ "-" + (Environment.Is64BitProcess ? "x64" : "x86")*/; + + var distro = File.Exists("/etc/alpine-release") ? "alpine" : "debian"; + + var paths = new[] + { + // This is where native libraries in our nupkg should end up + Path.Combine(rootDirectory, arch + distro, libFile), + // + Path.Combine(rootDirectory, libFile), + Path.Combine("/usr/local/lib", libFile), + Path.Combine("/usr/lib", libFile) + }; + + foreach (var path in paths) + { + if (path == null) + { + continue; + } + + if (File.Exists(path)) + { + var addr = Libdl.dlopen(path, Libdl.RTLD_NOW); + if (addr == IntPtr.Zero) + { + // Not using NanosmgException because it depends on nn_errno. + var error = Marshal.PtrToStringAnsi(Libdl.dlerror()); + throw new Exception("dlopen failed: " + path + " : " + error); + } + + return; + } + } + + throw new Exception("NIXERROR: dlopen failed: unable to locate library " + libFile + ". Searched: " + paths.Aggregate((a, b) => a + "; " + b)); + } } @@ -38,28 +143,6 @@ public static void ThrowIfError(UIntPtr code) //----------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------- - [Flags] - private enum LoadLibraryFlags : uint - { - DONT_RESOLVE_DLL_REFERENCES = 0x00000001, - LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, - LOAD_LIBRARY_AS_DATAFILE = 0x00000002, - LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, - LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, - LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200, - LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000, - LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100, - LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800, - LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400, - LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 - } - - [DllImport("kernel32", SetLastError = true)] - private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); - - //----------------------------------------------------------------------------------------- - //----------------------------------------------------------------------------------------- - [DllImport("libzstd", CallingConvention = CallingConvention.Cdecl)] public static extern uint ZSTD_versionNumber(); @@ -131,7 +214,7 @@ private enum LoadLibraryFlags : uint [DllImport("libzstd", CallingConvention = CallingConvention.Cdecl)] public static extern UIntPtr ZSTD_endStream(IntPtr zcs, [MarshalAs(UnmanagedType.LPStruct)] Buffer outputBuffer); - + //----------------------------------------------------------------------------------------- [DllImport("libzstd", CallingConvention = CallingConvention.Cdecl)] diff --git a/Zstandard.Net/ZstandardStream.cs b/Zstandard.Net/ZstandardStream.cs index 086e3cb..f13645d 100644 --- a/Zstandard.Net/ZstandardStream.cs +++ b/Zstandard.Net/ZstandardStream.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Buffers; using System.IO; using System.IO.Compression; diff --git a/Zstandard.Net/build/Zstandard.Net.targets b/Zstandard.Net/build/Zstandard.Net.targets index 2b53408..993ef5c 100644 --- a/Zstandard.Net/build/Zstandard.Net.targets +++ b/Zstandard.Net/build/Zstandard.Net.targets @@ -1,21 +1,30 @@ - + - - x64\%(FileName)%(Extension) + + win-x64\%(FileName)%(Extension) PreserveNewest - - x86\%(FileName)%(Extension) + + win-x86\%(FileName)%(Extension) PreserveNewest + + linuxdebian\%(FileName)%(Extension) + PreserveNewest + + + linuxalpine\%(FileName)%(Extension) + PreserveNewest + + - + %(FileName)%(Extension) PreserveNewest - + %(FileName)%(Extension) PreserveNewest diff --git a/Zstandard.Net/build/linuxalpine/libzstd.so b/Zstandard.Net/build/linuxalpine/libzstd.so new file mode 100644 index 0000000..bf38621 Binary files /dev/null and b/Zstandard.Net/build/linuxalpine/libzstd.so differ diff --git a/Zstandard.Net/build/linuxdebian/libzstd.so b/Zstandard.Net/build/linuxdebian/libzstd.so new file mode 100644 index 0000000..4b34213 Binary files /dev/null and b/Zstandard.Net/build/linuxdebian/libzstd.so differ diff --git a/Zstandard.Net/build/x64/libzstd.dll b/Zstandard.Net/build/win-x64/libzstd.dll similarity index 100% rename from Zstandard.Net/build/x64/libzstd.dll rename to Zstandard.Net/build/win-x64/libzstd.dll diff --git a/Zstandard.Net/build/x86/libzstd.dll b/Zstandard.Net/build/win-x86/libzstd.dll similarity index 100% rename from Zstandard.Net/build/x86/libzstd.dll rename to Zstandard.Net/build/win-x86/libzstd.dll diff --git a/zstd b/zstd new file mode 160000 index 0000000..32a98ba --- /dev/null +++ b/zstd @@ -0,0 +1 @@ +Subproject commit 32a98bafdc7aa01502db6f1de37880870f38d418