Marshal.Copy Method (Char(), Int32, IntPtr, Int32)

 
System_CAPS_noteNote

The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

Copies data from a one-dimensional, managed character array to an unmanaged memory pointer.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

<SecurityCriticalAttribute>
Public Shared Sub Copy (
	source As Char(),
	startIndex As Integer,
	destination As IntPtr,
	length As Integer
)

Parameters

source
Type: System.Char()

The one-dimensional array to copy from.

startIndex
Type: System.Int32

The zero-based index in the source array where copying should start.

destination
Type: System.IntPtr

The memory pointer to copy to.

length
Type: System.Int32

The number of array elements to copy.

Exception Condition
ArgumentOutOfRangeException

startIndex and length are not valid.

ArgumentNullException

startIndex, destination, or length is null.

You can use this method to copy a subset of a one-dimensional managed array to an unmanaged C-style array.

The following example copies an array to unmanaged memory and then copies the unmanaged array back to managed memory.

' Remember that the actual size of System.Char in unmanaged memory is 2.

Imports System
Imports System.Runtime.InteropServices



Module Module1

    Sub Main()
        ' Create a managed array.
        Dim managedArray As Char() = New Char(999) {}
        managedArray(0) = "a"c
        managedArray(1) = "b"c
        managedArray(2) = "c"c
        managedArray(3) = "d"c
        managedArray(999) = "Z"c

        ' Initialize unmanaged memory to hold the array.
        ' Dim size As Integer = Marshal.SizeOf(managedArray[0]) * managedArray.Length;  ' Incorrect
        Dim size As Integer = Marshal.SystemDefaultCharSize * managedArray.Length       ' Correct

        Dim pnt As IntPtr = Marshal.AllocHGlobal(size)

        Try
            ' Copy the array to unmanaged memory.
            Marshal.Copy(managedArray, 0, pnt, managedArray.Length)

            ' Copy the unmanaged array back to another managed array.

            Dim managedArray2 As Char() = New Char(managedArray.Length - 1) {}

            Marshal.Copy(pnt, managedArray2, 0, managedArray.Length)
            Console.WriteLine("Here is the roundtripped array: {0} {1} {2} {3} {4}", managedArray2(0), managedArray2(1), managedArray2(2), managedArray2(3), managedArray2(999))


            Console.WriteLine("The array was copied to unmanaged memory and back.")
        Finally
            ' Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt)

        End Try
    End Sub
End Module

SecurityCriticalAttribute

requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

Universal Windows Platform
Available since 8
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1
Return to top
Show: