From cc7170875fc9def8c2e633f4b4d1dfc310da8744 Mon Sep 17 00:00:00 2001 From: dahall Date: Fri, 17 Jan 2020 07:54:15 -0700 Subject: [PATCH] Fix and test for #101 - Bug when using SafeAnysizeStruct. --- PInvoke/Shared/InteropServices/SafeAnysizeStruct.cs | 6 +++--- UnitTests/PInvoke/Shared/InteropServices/AnysizeStructTests.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PInvoke/Shared/InteropServices/SafeAnysizeStruct.cs b/PInvoke/Shared/InteropServices/SafeAnysizeStruct.cs index 5eb3b38b..e94a28ac 100644 --- a/PInvoke/Shared/InteropServices/SafeAnysizeStruct.cs +++ b/PInvoke/Shared/InteropServices/SafeAnysizeStruct.cs @@ -123,9 +123,9 @@ namespace Vanara.InteropServices Size = memSz; // Marshal base structure - don't use Write to prevent loops Marshal.StructureToPtr(value, handle, false); - // Push each element of the array into memory - for (var i = 0; i < arrLen; i++) - handle.Write(((Array)arrVal).GetValue(i), baseSz - arrElemSz * (i - 1), memSz); + // Push each element of the array into memory, starting with second item in array since first was pushed by StructureToPtr + for (var i = 1; i < arrLen; i++) + handle.Write(((Array)arrVal).GetValue(i), baseSz + arrElemSz * (i - 1), memSz); } } diff --git a/UnitTests/PInvoke/Shared/InteropServices/AnysizeStructTests.cs b/UnitTests/PInvoke/Shared/InteropServices/AnysizeStructTests.cs index be7ffaf0..f1443626 100644 --- a/UnitTests/PInvoke/Shared/InteropServices/AnysizeStructTests.cs +++ b/UnitTests/PInvoke/Shared/InteropServices/AnysizeStructTests.cs @@ -29,7 +29,7 @@ namespace Vanara.InteropServices.Tests [Test] public void ConvertTest() { - var array = new[] { long.MinValue, 0L, long.MaxValue }; + var array = new[] { long.MinValue, 1L, long.MaxValue }; var ts = new TestStruct { iVal = array.Length, array = array }; using var mem = new SafeAnysizeStruct(ts);