Marshal.StructureToPtr 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
StructureToPtr(Object, IntPtr, Boolean) |
사용되지 않음.
관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다. |
StructureToPtr<T>(T, IntPtr, Boolean) |
지정된 형식의 관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다. |
StructureToPtr(Object, IntPtr, Boolean)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.CoreCLR.cs
주의
StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516
관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.
public:
static void StructureToPtr(System::Object ^ structure, IntPtr ptr, bool fDeleteOld);
[System.Obsolete("StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516")]
[System.Security.SecurityCritical]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Runtime.InteropServices.ComVisible(true)]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void StructureToPtr (object structure, IntPtr ptr, bool fDeleteOld);
[<System.Obsolete("StructureToPtr(Object, IntPtr, Boolean) may be unavailable in future releases. Instead, use StructureToPtr<T>(T, IntPtr, Boolean). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296516")>]
[<System.Security.SecurityCritical>]
static member StructureToPtr : obj * nativeint * bool -> unit
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Security.SecurityCritical>]
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
static member StructureToPtr : obj * nativeint * bool -> unit
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member StructureToPtr : obj * nativeint * bool -> unit
Public Shared Sub StructureToPtr (structure As Object, ptr As IntPtr, fDeleteOld As Boolean)
매개 변수
- structure
- Object
마샬링될 데이터가 있는 관리되는 개체입니다. 이 개체는 구조체이거나 형식이 지정된 클래스의 인스턴스여야 합니다.
- ptr
-
IntPtr
nativeint
관리되지 않는 메모리 블록에 대한 포인터로서 이 메서드가 호출되기 전에 할당되어야 합니다.
- fDeleteOld
- Boolean
이 메서드가 데이터를 복사하기 전에 ptr
매개 변수에 대해 DestroyStructure(IntPtr, Type) 메서드를 호출하려면 true
입니다. 블록에는 유효한 데이터가 있어야 합니다. 메모리 블록에 이미 데이터가 포함되어 있을 때 false
를 전달하면 메모리 누수가 발생할 수 있습니다.
- 특성
예외
structure
가 형식이 지정된 클래스가 아닌 참조 형식인 경우
또는
structure
은 제네릭 형식(.NET Framework 4.5 및 이전 버전에만 해당)의 인스턴스입니다.
예제
다음 예제에서는 관리되는 구조를 만들고 메서드를 사용하여 StructureToPtr 관리되지 않는 메모리로 전송한 다음 메서드를 사용하여 PtrToStructure 관리되는 메모리로 다시 전송합니다.
using System;
using System.Runtime.InteropServices;
public struct Point
{
public int x;
public int y;
}
class Example
{
static void Main()
{
// Create a point struct.
Point p;
p.x = 1;
p.y = 1;
Console.WriteLine("The value of first point is " + p.x + " and " + p.y + ".");
// Initialize unmanged memory to hold the struct.
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p));
try
{
// Copy the struct to unmanaged memory.
Marshal.StructureToPtr(p, pnt, false);
// Create another point.
Point anotherP;
// Set this Point to the value of the
// Point in unmanaged memory.
anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));
Console.WriteLine("The value of new point is " + anotherP.x + " and " + anotherP.y + ".");
}
finally
{
// Free the unmanaged memory.
Marshal.FreeHGlobal(pnt);
}
}
}
Imports System.Runtime.InteropServices
Public Structure Point
Public x As Integer
Public y As Integer
End Structure
Module Example
Sub Main()
' Create a point struct.
Dim p As Point
p.x = 1
p.y = 1
Console.WriteLine("The value of first point is " + p.x.ToString + " and " + p.y.ToString + ".")
' Initialize unmanged memory to hold the struct.
Dim pnt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(p))
Try
' Copy the struct to unmanaged memory.
Marshal.StructureToPtr(p, pnt, False)
' Create another point.
Dim anotherP As Point
' Set this Point to the value of the
' Point in unmanaged memory.
anotherP = CType(Marshal.PtrToStructure(pnt, GetType(Point)), Point)
Console.WriteLine("The value of new point is " + anotherP.x.ToString + " and " + anotherP.y.ToString + ".")
Finally
' Free the unmanaged memory.
Marshal.FreeHGlobal(pnt)
End Try
End Sub
End Module
설명
가 값 형식인 경우 structure
boxed 또는 unboxed일 수 있습니다. boxed인 경우 복사하기 전에 받은 편지함이 해제됩니다.
형식이 지정된 클래스는 특성에 의해 StructLayoutAttribute 레이아웃이 또는 LayoutKind.Sequential로 LayoutKind.Explicit 지정된 참조 형식입니다.
StructureToPtr 는 의 내용을 structure
매개 변수가 가리키는 미리 할당된 메모리 블록에 ptr
복사합니다. COM 인터페이스 포인터(인터페이스, 레이아웃이 없는 클래스 및 System.Object)에 마샬링하는 참조 형식이 포함된 경우 structure
관리되는 개체는 참조 횟수로 활성 상태로 유지됩니다. 다른 모든 참조 형식(예: 문자열 및 배열)은 복사본으로 마샬링됩니다. 관리되는 개체나 관리되지 않는 개체를 해제하려면 메모리 블록을 해제하기 전에 메서드를 호출 Marshal.DestroyStructure 해야 합니다.
메서드를 StructureToPtr 사용하여 나중에 메모리 블록에 다른 인스턴스를 복사하는 경우 를 지정 true
fDeleteOld
하여 이전 인스턴스의 참조 형식에 대한 참조 수를 제거합니다. 그렇지 않으면 관리되는 참조 형식 및 관리되지 않는 복사본이 효과적으로 유출됩니다.
사용에 StructureToPtr 대한 전체 패턴은 다음과 같습니다.
메모리 블록이 할당된
fDeleteOld
후 메서드에 StructureToPtr 대한 첫 번째 호출에서는 지울 내용이 없으므로 이어야false
합니다.중요
블록에
fDeleteOld
유효한 데이터가 포함된 경우에만 을 지정true
합니다.다른 인스턴스를 메모리 블록에 복사하고 개체에 참조 형식이 포함된 경우 이전 콘텐츠에서 참조 형식
fDeleteOld
을 해제하려면 여야true
합니다.개체에 참조 형식이 포함된 경우 메모리 블록을 해제하기 전에 메서드를 호출 DestroyStructure 해야 합니다.
참고
기존 구조를 복사하는 대신 고정하려면 형식을 System.Runtime.InteropServices.GCHandle 사용하여 구조체에 대해 고정된 핸들을 만듭니다. 고정하는 방법에 대한 자세한 내용은 복사 및 고정을 참조하세요.
추가 정보
적용 대상
StructureToPtr<T>(T, IntPtr, Boolean)
- Source:
- Marshal.cs
- Source:
- Marshal.cs
- Source:
- Marshal.cs
지정된 형식의 관리되는 개체의 데이터를 관리되지 않는 메모리 블록으로 마샬링합니다.
public:
generic <typename T>
static void StructureToPtr(T structure, IntPtr ptr, bool fDeleteOld);
[System.Security.SecurityCritical]
public static void StructureToPtr<T> (T structure, IntPtr ptr, bool fDeleteOld);
public static void StructureToPtr<T> (T structure, IntPtr ptr, bool fDeleteOld);
[<System.Security.SecurityCritical>]
static member StructureToPtr : 'T * nativeint * bool -> unit
static member StructureToPtr : 'T * nativeint * bool -> unit
Public Shared Sub StructureToPtr(Of T) (structure As T, ptr As IntPtr, fDeleteOld As Boolean)
형식 매개 변수
- T
관리되는 개체의 형식입니다.
매개 변수
- structure
- T
마샬링될 데이터가 있는 관리되는 개체입니다. 이 개체는 구조체이거나 형식이 지정된 클래스의 인스턴스여야 합니다.
- ptr
-
IntPtr
nativeint
관리되지 않는 메모리 블록에 대한 포인터로서 이 메서드가 호출되기 전에 할당되어야 합니다.
- fDeleteOld
- Boolean
이 메서드가 데이터를 복사하기 전에 ptr
매개 변수에 대해 DestroyStructure<T>(IntPtr) 메서드를 호출하려면 true
입니다. 블록에는 유효한 데이터가 있어야 합니다. 메모리 블록에 이미 데이터가 포함되어 있을 때 false
를 전달하면 메모리 누수가 발생할 수 있습니다.
- 특성
예외
structure
가 형식이 지정된 클래스가 아닌 참조 형식인 경우
설명
형식이 지정된 클래스는 특성에 의해 StructLayoutAttribute 레이아웃이 또는 LayoutKind.Sequential로 LayoutKind.Explicit 지정된 참조 형식입니다.
StructureToPtr<T>(T, IntPtr, Boolean) 는 의 내용을 structure
매개 변수가 가리키는 미리 할당된 메모리 블록에 ptr
복사합니다. COM 인터페이스 포인터(인터페이스, 레이아웃이 없는 클래스 및 System.Object)에 마샬링하는 참조 형식이 포함된 경우 structure
관리되는 개체는 참조 횟수로 활성 상태로 유지됩니다. 다른 모든 참조 형식(예: 문자열 및 배열)은 복사본으로 마샬링됩니다. 관리되는 개체나 관리되지 않는 개체를 해제하려면 메모리 블록을 해제하기 전에 메서드를 호출 DestroyStructure<T>(IntPtr) 해야 합니다.
메서드를 StructureToPtr<T>(T, IntPtr, Boolean) 사용하여 나중에 메모리 블록에 다른 인스턴스를 복사하는 경우 를 지정 true
fDeleteOld
하여 이전 인스턴스의 참조 형식에 대한 참조 수를 제거합니다. 그렇지 않으면 관리되는 참조 형식 및 관리되지 않는 복사본이 효과적으로 유출됩니다.
사용에 StructureToPtr<T>(T, IntPtr, Boolean) 대한 전체 패턴은 다음과 같습니다.
메모리 블록이 할당된
fDeleteOld
후 메서드에 StructureToPtr 대한 첫 번째 호출에서는 지울 내용이 없으므로 이어야false
합니다.중요
블록에
fDeleteOld
유효한 데이터가 포함된 경우에만 을 지정true
합니다.다른 인스턴스를 메모리 블록에 복사하고 개체에 참조 형식이 포함된 경우 이전 콘텐츠에서 참조 형식
fDeleteOld
을 해제하려면 여야true
합니다.개체에 참조 형식이 포함된 경우 메모리 블록을 해제하기 전에 메서드를 호출 DestroyStructure 해야 합니다.
참고
기존 구조를 복사하는 대신 고정하려면 형식을 System.Runtime.InteropServices.GCHandle 사용하여 구조체에 대해 고정된 핸들을 만듭니다. 고정하는 방법에 대한 자세한 내용은 복사 및 고정을 참조하세요.
추가 정보
적용 대상
.NET