diff --git a/PInvoke/Shared/StructHelper.cs b/PInvoke/Shared/StructHelper.cs
new file mode 100644
index 00000000..127bed11
--- /dev/null
+++ b/PInvoke/Shared/StructHelper.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Runtime.CompilerServices;
+using Vanara.Extensions;
+
+namespace Vanara.PInvoke
+{
+ /// Helper methods for structures.
+ public static class StructHelper
+ {
+ /// Gets the address of a reference.
+ /// The unmanaged value type to convert.
+ /// The target value.
+ /// The address of .
+ /// This address will only remain valid if the target value or its encapsulating type are pinned.
+ public static IntPtr DangerousAddressOf(ref T target) where T : unmanaged
+ {
+ unsafe
+ {
+ fixed (T* p = &target)
+ return (IntPtr)p;
+ }
+ }
+
+ /// Converts a field reference to array. Used when a structure defines an ANYSIZE array as the last field.
+ /// The unmanaged type to convert.
+ /// A reference to the field value.
+ /// The number of items in the array.
+ /// The offset from the field value at which to start extracting the array.
+ /// An item array of values of .
+ ///
+ /// Properties defined with this can only be safely used when the structure has been marshaled via a dynamic memory block and not
+ /// when marshaled directly.
+ ///
+#if !(NET20 || NET35 || NET40)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+#endif
+ public unsafe static T[] FieldToArray(ref T fieldReference, int count, int offset = 0) where T : unmanaged
+ {
+ if (count == 0) return new T[0];
+ return DangerousAddressOf(ref fieldReference).ToArray(count, offset);
+ }
+ }
+}
\ No newline at end of file