Skip to content

Commit 20d3f0f

Browse files
committed
Adding local changes
- Use Process.GetCurrentProcess() to get executable name in System.CommandLine - Adding ARM64 build support with ReleaseCore configuration (wittout ZSTD support atm) - Adding AdvSIMD for ARM64 machines - Use ArrayPool for both rleCodeBuffer and rleCtrlBuffer on Fast Buffer mode if the ArrayPool space is sufficient - Simplify and clean up some codes - Fix 4 step RLE addition not calculating the remaining buffer even the size >= 4 bytes.
1 parent c0b3351 commit 20d3f0f

File tree

11 files changed

+155
-68
lines changed

11 files changed

+155
-68
lines changed
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net8.0</TargetFrameworks>
4+
<TargetFramework>net8.0</TargetFramework>
55
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
6-
<Platforms>x64;x86;ARM64</Platforms>
6+
<Platforms>x64;ARM64</Platforms>
7+
<PlatformTarget>x64</PlatformTarget>
8+
<Configurations>Debug;Release;ReleaseCore</Configurations>
79
</PropertyGroup>
810

9-
<ItemGroup>
11+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' Or '$(Configuration)|$(Platform)'=='Release|x64'">
12+
<DefineConstants>UseZSTD</DefineConstants>
13+
</PropertyGroup>
14+
15+
<ItemGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' Or '$(Configuration)|$(Platform)'=='Release|x64'">
1016
<Content Include="Binary\Compression\Zstd\libzstd.dll">
1117
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1218
<TargetPath>Lib\libzstd.dll</TargetPath>
1319
</Content>
1420
</ItemGroup>
1521

16-
<PropertyGroup Condition="'$(Configuration)'=='Release'">
22+
<PropertyGroup Condition="'$(Configuration)'=='Release' Or '$(Configuration)'=='ReleaseCore'">
1723
<Optimize>True</Optimize>
1824
<DebugType>portable</DebugType>
1925
<TieredPGO>true</TieredPGO>
@@ -22,4 +28,8 @@
2228
<TieredCompilationQuickJitForLoops>false</TieredCompilationQuickJitForLoops>
2329
</PropertyGroup>
2430

31+
<PropertyGroup Condition="'$(Platform)'=='ARM64'">
32+
<DefineConstants>IsARM64</DefineConstants>
33+
</PropertyGroup>
34+
2535
</Project>

Hi3Helper.SharpHDiffPatch/PatchCore/Header.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,7 @@ private static void TryReadHeaderAndReferenceInfo(Stream sr, ref HeaderInfo head
228228

229229
private static void TrySeekHeader(Stream sr, int skipLongSize)
230230
{
231-
int len = 4096;
232-
if (len > skipLongSize)
233-
{
234-
len = skipLongSize;
235-
}
236-
231+
int len = Math.Min(4 << 10, skipLongSize);
237232
HDiffPatch.Event.PushLog($"[Header::TrySeekHeader] Seeking from: {sr.Position} += {skipLongSize} to {sr.Position + skipLongSize}", Verbosity.Debug);
238233
sr.Seek(len, SeekOrigin.Current);
239234
}

Hi3Helper.SharpHDiffPatch/PatchCore/PatchCore.cs

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@
88
using System.IO.Compression;
99
using System.Linq;
1010
using System.Runtime.Intrinsics;
11+
#if IsARM64
12+
using System.Runtime.Intrinsics.Arm;
13+
#else
1114
using System.Runtime.Intrinsics.X86;
15+
#endif
1216
using System.Threading;
1317
using System.Threading.Tasks;
18+
#if UseZSTD
1419
using ZstdNet;
20+
#endif
1521
using static Hi3Helper.SharpHDiffPatch.StreamExtension;
1622

1723
namespace Hi3Helper.SharpHDiffPatch
@@ -128,7 +134,9 @@ public void GetDecompressStreamPlugin(CompressionMode type, Stream sourceStream,
128134
decompStream = type switch
129135
{
130136
CompressionMode.nocomp => rawStream,
131-
CompressionMode.zstd => new DecompressionStream(rawStream, new DecompressionOptions(null, new Dictionary<ZSTD_dParameter, int>()
137+
CompressionMode.zstd =>
138+
#if UseZSTD
139+
new DecompressionStream(rawStream, new DecompressionOptions(null, new Dictionary<ZSTD_dParameter, int>()
132140
{
133141
/* HACK: The default window log max size is 30. This is unacceptable since the native HPatch implementation
134142
* always use 31 as the size_t, which is 8 bytes length.
@@ -138,13 +146,16 @@ public void GetDecompressStreamPlugin(CompressionMode type, Stream sourceStream,
138146
*/
139147
{ ZSTD_dParameter.ZSTD_d_windowLogMax, 31 }
140148
}), 0),
149+
#else
150+
throw new NotSupportedException($"[PatchCore::GetDecompressStreamPlugin] Compression Type: zstd is not supported in this build of SharpHDiffPatch!"),
151+
#endif
141152
CompressionMode.zlib => new DeflateStream(rawStream, System.IO.Compression.CompressionMode.Decompress, true),
142153
CompressionMode.bz2 => new CBZip2InputStream(rawStream, false, true),
143154
CompressionMode.pbz2 => new CBZip2InputStream(rawStream, true, true),
144155
CompressionMode.lzma => CreateLzmaStream(rawStream),
145156
CompressionMode.lzma2 => CreateLzmaStream(rawStream),
146157
_ => throw new NotSupportedException($"[PatchCore::GetDecompressStreamPlugin] Compression Type: {type} is not supported")
147-
};
158+
};;
148159
}
149160

150161
private Stream CreateLzmaStream(Stream rawStream)
@@ -167,11 +178,11 @@ private Stream CreateLzmaStream(Stream rawStream)
167178
}
168179
else
169180
{
170-
byte[] props = new byte[propLen];
171-
rawStream.Read(props);
181+
// byte[] props = new byte[propLen];
182+
// rawStream.Read(props);
172183

173184
// return new LzmaDecoderStream(rawStream, props, long.MaxValue);
174-
throw new NotSupportedException($"LZMA compression is not supported! only LZMA2 is currently supported!");
185+
throw new NotSupportedException($"[PatchCore::CreateLzmaStream] LZMA compression is not supported! only LZMA2 is currently supported!");
175186
}
176187
}
177188

@@ -472,7 +483,9 @@ internal void TBytesSetRleSingle(ref RLERefClipStruct rleLoader, Stream outCache
472483
outCache.Read(sharedBuffer, 0, length);
473484
outCache.Position = lastPos;
474485

475-
do sharedBuffer[--length] += rleLoader.memSetValue; while (length > 0);
486+
SetAddRLESingle:
487+
sharedBuffer[--length] += rleLoader.memSetValue;
488+
if (length > 0) goto SetAddRLESingle;
476489

477490
outCache.Write(sharedBuffer, 0, (int)memSetStep);
478491
}
@@ -486,14 +499,97 @@ internal void TBytesSetRleSingle(ref RLERefClipStruct rleLoader, Stream outCache
486499
}
487500
}
488501

502+
internal unsafe void TBytesSetRleVectorV2(ref RLERefClipStruct rleLoader, Stream outCache, ref long copyLength, int decodeStep, byte* rlePtr, byte[] rleBuffer, int rleBufferIdx, byte* oldPtr)
503+
{
504+
int len = decodeStep;
505+
#if IsARM64
506+
if (Vector128.IsHardwareAccelerated && len >= Vector128<byte>.Count)
507+
{
508+
AddVectorArm64_128:
509+
len -= Vector128<byte>.Count;
510+
Vector128<byte> resultVector = AdvSimd.Add(*(Vector128<byte>*)(rlePtr + len), *(Vector128<byte>*)(oldPtr + len));
511+
AdvSimd.Store(rlePtr + len, resultVector);
512+
if (len > Vector128<byte>.Count) goto AddVectorArm64_128;
513+
}
514+
else if (Vector64.IsHardwareAccelerated && len >= Vector64<byte>.Count)
515+
{
516+
AddVectorArm64_64:
517+
len -= Vector64<byte>.Count;
518+
Vector64<byte> resultVector = AdvSimd.Add(*(Vector64<byte>*)(rlePtr + len), *(Vector64<byte>*)(oldPtr + len));
519+
AdvSimd.Store(rlePtr + len, resultVector);
520+
if (len > Vector64<byte>.Count) goto AddVectorArm64_64;
521+
}
522+
#else
523+
if (Sse2.IsSupported && len >= Vector128<byte>.Count)
524+
{
525+
AddVectorSse2:
526+
len -= Vector128<byte>.Count;
527+
Vector128<byte> resultVector = Sse2.Add(*(Vector128<byte>*)(rlePtr + len), *(Vector128<byte>*)(oldPtr + len));
528+
Sse2.Store(rlePtr + len, resultVector);
529+
if (len > Vector128<byte>.Count) goto AddVectorSse2;
530+
}
531+
#endif
532+
533+
if (len >= 4)
534+
{
535+
AddRemainsFourStep:
536+
len -= 4;
537+
*(rlePtr + len) += *(oldPtr + len);
538+
*(rlePtr + 1 + len) += *(oldPtr + 1 + len);
539+
*(rlePtr + 2 + len) += *(oldPtr + 2 + len);
540+
*(rlePtr + 3 + len) += *(oldPtr + 3 + len);
541+
if (len >= 4) goto AddRemainsFourStep;
542+
}
543+
544+
AddRemainsVectorRLE:
545+
if (len == 0) goto WriteAllVectorRLE;
546+
*(rlePtr + --len) += *(oldPtr + len);
547+
goto AddRemainsVectorRLE;
548+
549+
WriteAllVectorRLE:
550+
outCache.Write(rleBuffer.AsSpan(rleBufferIdx, decodeStep));
551+
552+
rleLoader.memCopyLength -= decodeStep;
553+
copyLength -= decodeStep;
554+
}
555+
489556
internal unsafe void TBytesSetRleVector(ref RLERefClipStruct rleLoader, Stream outCache, ref long copyLength, int decodeStep, byte* rlePtr, byte[] rleBuffer, int rleBufferIdx, byte* oldPtr)
490557
{
491558
int offset = 0;
492559
long offsetRemained = 0;
493560

561+
#if IsARM64
562+
if (Vector128.IsHardwareAccelerated && decodeStep >= Vector128<byte>.Count)
563+
{
564+
offsetRemained = decodeStep % Vector128<byte>.Count;
565+
566+
AddVectorArm64_128:
567+
Vector128<byte>* rleVector = (Vector128<byte>*)(rlePtr + offset);
568+
Vector128<byte>* oldVector = (Vector128<byte>*)(oldPtr + offset);
569+
Vector128<byte> resultVector = AdvSimd.Add(*rleVector, *oldVector);
570+
571+
AdvSimd.Store(rlePtr + offset, resultVector);
572+
offset += Vector128<byte>.Count;
573+
if (offset < decodeStep - offsetRemained) goto AddVectorArm64_128;
574+
}
575+
else if (Vector64.IsHardwareAccelerated && decodeStep >= Vector64<byte>.Count)
576+
{
577+
offsetRemained = decodeStep % Vector64<byte>.Count;
578+
579+
AddVectorArm64_64:
580+
Vector64<byte>* rleVector = (Vector64<byte>*)(rlePtr + offset);
581+
Vector64<byte>* oldVector = (Vector64<byte>*)(oldPtr + offset);
582+
Vector64<byte> resultVector = AdvSimd.Add(*rleVector, *oldVector);
583+
584+
AdvSimd.Store(rlePtr + offset, resultVector);
585+
offset += Vector64<byte>.Count;
586+
if (offset < decodeStep - offsetRemained) goto AddVectorArm64_64;
587+
}
588+
#else
494589
if (Sse2.IsSupported && decodeStep >= Vector128<byte>.Count)
495590
{
496591
offsetRemained = decodeStep % Vector128<byte>.Count;
592+
497593
AddVectorSse2:
498594
Vector128<byte>* rleVector = (Vector128<byte>*)(rlePtr + offset);
499595
Vector128<byte>* oldVector = (Vector128<byte>*)(oldPtr + offset);
@@ -503,6 +599,7 @@ internal unsafe void TBytesSetRleVector(ref RLERefClipStruct rleLoader, Stream o
503599
offset += Vector128<byte>.Count;
504600
if (offset < decodeStep - offsetRemained) goto AddVectorSse2;
505601
}
602+
#endif
506603

507604
if (offsetRemained != 0 && (offsetRemained % 4) == 0)
508605
{

Hi3Helper.SharpHDiffPatch/PatchCore/PatchCoreFastBuffer.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,28 +39,28 @@ public void UncoverBufferClipsStream(Stream[] clips, Stream inputStream, Stream
3939

4040
private unsafe void WriteCoverStreamToOutputFast(Stream[] clips, Stream inputStream, Stream outputStream, HeaderInfo headerInfo)
4141
{
42-
byte[] sharedBuffer = null;
43-
byte[] rleCtrlBuffer = null;
44-
MemoryStream cacheOutputStream = null;
45-
bool isCtrlUseArrayPool = headerInfo.chunkInfo.rle_ctrlBuf_size <= _maxArrayPoolSecondOffset;
42+
byte[] sharedBuffer = ArrayPool<byte>.Shared.Rent(_maxArrayPoolSecondOffset);
43+
MemoryStream cacheOutputStream = new MemoryStream(_maxMemBufferLimit);
44+
int poolSizeRemained = _maxArrayPoolLen - sharedBuffer.Length;
45+
46+
bool isCtrlUseArrayPool = headerInfo.chunkInfo.rle_ctrlBuf_size <= poolSizeRemained;
47+
byte[] rleCtrlBuffer = isCtrlUseArrayPool ? ArrayPool<byte>.Shared.Rent((int)headerInfo.chunkInfo.rle_ctrlBuf_size) : new byte[headerInfo.chunkInfo.rle_ctrlBuf_size];
48+
poolSizeRemained -= rleCtrlBuffer.Length;
49+
50+
bool isRleUseArrayPool = headerInfo.chunkInfo.rle_codeBuf_size <= poolSizeRemained;
51+
byte[] rleCodeBuffer = isRleUseArrayPool ? ArrayPool<byte>.Shared.Rent((int)headerInfo.chunkInfo.rle_codeBuf_size) : new byte[headerInfo.chunkInfo.rle_codeBuf_size];
4652

4753
try
4854
{
4955
_core.RunCopySimilarFilesRoutine();
50-
51-
cacheOutputStream = new MemoryStream(_maxMemBufferLimit);
52-
sharedBuffer = ArrayPool<byte>.Shared.Rent(_maxArrayPoolSecondOffset);
53-
5456
int rleCtrlIdx = 0, rleCodeIdx = 0;
55-
rleCtrlBuffer = isCtrlUseArrayPool ? ArrayPool<byte>.Shared.Rent(_maxArrayPoolSecondOffset) : new byte[headerInfo.chunkInfo.rle_ctrlBuf_size];
56-
byte[] rleCodeBuffer = new byte[headerInfo.chunkInfo.rle_codeBuf_size];
5757

5858
using (clips[1])
5959
using (clips[2])
6060
{
6161
HDiffPatch.Event.PushLog($"[PatchCoreFastBuffer::WriteCoverStreamToOutputFast] Buffering RLE Ctrl clip to {(isCtrlUseArrayPool ? "ArrayPool" : "heap buffer")}");
6262
clips[1].ReadExactly(rleCtrlBuffer, 0, (int)headerInfo.chunkInfo.rle_ctrlBuf_size);
63-
HDiffPatch.Event.PushLog($"[PatchCoreFastBuffer::WriteCoverStreamToOutputFast] Buffering RLE Code clip to heap buffer");
63+
HDiffPatch.Event.PushLog($"[PatchCoreFastBuffer::WriteCoverStreamToOutputFast] Buffering RLE Code clip to {(isRleUseArrayPool ? "ArrayPool" : "heap buffer")}");
6464
clips[2].ReadExactly(rleCodeBuffer, 0, (int)headerInfo.chunkInfo.rle_codeBuf_size);
6565
}
6666

@@ -113,6 +113,7 @@ private unsafe void WriteCoverStreamToOutputFast(Stream[] clips, Stream inputStr
113113
{
114114
if (sharedBuffer != null) ArrayPool<byte>.Shared.Return(sharedBuffer);
115115
if (rleCtrlBuffer != null && isCtrlUseArrayPool) ArrayPool<byte>.Shared.Return(rleCtrlBuffer);
116+
if (rleCodeBuffer != null && isRleUseArrayPool) ArrayPool<byte>.Shared.Return(rleCodeBuffer);
116117
_core._stopwatch?.Stop();
117118
cacheOutputStream?.Dispose();
118119
clips[0]?.Dispose();
@@ -196,7 +197,7 @@ private unsafe void TBytesSetRleCopyOnly(ref RLERefClipStruct rleLoader, Stream
196197
fixed (byte* rlePtr = &rleCodeBuffer[rleCodeIdx])
197198
fixed (byte* oldPtr = sharedBuffer)
198199
{
199-
_core.TBytesSetRleVector(ref rleLoader, outCache, ref copyLength, decodeStep, rlePtr, rleCodeBuffer, rleCodeIdx, oldPtr);
200+
_core.TBytesSetRleVectorV2(ref rleLoader, outCache, ref copyLength, decodeStep, rlePtr, rleCodeBuffer, rleCodeIdx, oldPtr);
200201
}
201202
rleCodeIdx += decodeStep;
202203
}

SharpHDiffPatch.sln

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,36 +11,36 @@ Global
1111
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1212
Debug|ARM64 = Debug|ARM64
1313
Debug|x64 = Debug|x64
14-
Debug|x86 = Debug|x86
1514
Release|ARM64 = Release|ARM64
1615
Release|x64 = Release|x64
17-
Release|x86 = Release|x86
16+
ReleaseCore|ARM64 = ReleaseCore|ARM64
17+
ReleaseCore|x64 = ReleaseCore|x64
1818
EndGlobalSection
1919
GlobalSection(ProjectConfigurationPlatforms) = postSolution
2020
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|ARM64.ActiveCfg = Debug|ARM64
2121
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|ARM64.Build.0 = Debug|ARM64
2222
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|x64.ActiveCfg = Debug|x64
2323
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|x64.Build.0 = Debug|x64
24-
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|x86.ActiveCfg = Debug|x86
25-
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Debug|x86.Build.0 = Debug|x86
2624
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|ARM64.ActiveCfg = Release|ARM64
2725
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|ARM64.Build.0 = Release|ARM64
2826
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|x64.ActiveCfg = Release|x64
2927
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|x64.Build.0 = Release|x64
30-
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|x86.ActiveCfg = Release|x86
31-
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.Release|x86.Build.0 = Release|x86
28+
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.ReleaseCore|ARM64.ActiveCfg = ReleaseCore|ARM64
29+
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.ReleaseCore|ARM64.Build.0 = ReleaseCore|ARM64
30+
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.ReleaseCore|x64.ActiveCfg = ReleaseCore|x64
31+
{57CB7A6D-2474-4A01-BE1A-5D1488F81390}.ReleaseCore|x64.Build.0 = ReleaseCore|x64
3232
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|ARM64.ActiveCfg = Debug|ARM64
3333
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|ARM64.Build.0 = Debug|ARM64
3434
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|x64.ActiveCfg = Debug|x64
3535
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|x64.Build.0 = Debug|x64
36-
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|x86.ActiveCfg = Debug|x86
37-
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Debug|x86.Build.0 = Debug|x86
3836
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|ARM64.ActiveCfg = Release|ARM64
3937
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|ARM64.Build.0 = Release|ARM64
4038
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|x64.ActiveCfg = Release|x64
4139
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|x64.Build.0 = Release|x64
42-
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|x86.ActiveCfg = Release|x86
43-
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.Release|x86.Build.0 = Release|x86
40+
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.ReleaseCore|ARM64.ActiveCfg = ReleaseCore|ARM64
41+
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.ReleaseCore|ARM64.Build.0 = ReleaseCore|ARM64
42+
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.ReleaseCore|x64.ActiveCfg = ReleaseCore|x64
43+
{506DDD1C-DD74-4FCE-A0C9-D90E904CF708}.ReleaseCore|x64.Build.0 = ReleaseCore|x64
4444
EndGlobalSection
4545
GlobalSection(SolutionProperties) = preSolution
4646
HideSolutionNode = FALSE

SharpHDiffPatch/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,15 @@ private static void PrintLog(LoggerEvent e)
157157
Console.WriteLine($"{label}{e.Message}");
158158
}
159159

160-
private static async void EventListener_PatchEvent(object? sender, PatchEvent e)
160+
private static async void EventListener_PatchEvent(object sender, PatchEvent e)
161161
{
162-
if (await CheckIfNeedRefreshStopwatch(e.ProgressPercentage))
162+
if (await CheckIfNeedRefreshStopwatch())
163163
{
164164
Console.Write($"Patching: {e.ProgressPercentage}% | {SummarizeSizeSimple(e.CurrentSizePatched)}/{SummarizeSizeSimple(e.TotalSizeToBePatched)} @{SummarizeSizeSimple(e.Speed)}/s \r");
165165
}
166166
}
167167

168-
private static async Task<bool> CheckIfNeedRefreshStopwatch(double progress)
168+
private static async Task<bool> CheckIfNeedRefreshStopwatch()
169169
{
170170
if (RefreshStopwatch.ElapsedMilliseconds > RefreshInterval)
171171
{

SharpHDiffPatch/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"profiles": {
33
"SharpHDiffPatch-bin": {
44
"commandName": "Project",
5-
"commandLineArgs": "C:\\CollapseData\\Banks0.pck C:\\CollapseData\\Banks0.pck.hdiff C:\\CollapseData\\Banks0.pck.new2 -B -b partial"
5+
"commandLineArgs": "E:\\CollapseData\\test\\Banks0.pck E:\\CollapseData\\test\\Banks0.pck.hdiff E:\\CollapseData\\test\\Banks0.pckNew -B -b partial -l Quiet"
66
}
77
}
88
}

SharpHDiffPatch/SharpHDiffPatch.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55
<TargetFramework>net8.0</TargetFramework>
66
<RootNamespace>SharpHDiffPatch</RootNamespace>
77
<ImplicitUsings>disable</ImplicitUsings>
8-
<Nullable>enable</Nullable>
9-
<Platforms>x64;x86;ARM64</Platforms>
8+
<Platforms>x64;ARM64</Platforms>
109
<Version>2.1.0</Version>
1110
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
1211
<DefineConstants></DefineConstants>
12+
<Configurations>Debug;Release;ReleaseCore</Configurations>
13+
</PropertyGroup>
14+
15+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' Or '$(Configuration)|$(Platform)'=='Release|x64'">
16+
<DefineConstants>UseZSTD</DefineConstants>
1317
</PropertyGroup>
1418

1519
<ItemGroup>

0 commit comments

Comments
 (0)