Marshal.PtrToStructure Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Marshal data dari blok memori yang tidak dikelola ke objek terkelola.
Overload
PtrToStructure(IntPtr, Object) |
Kedaluwarsa.
Marshal data dari blok memori yang tidak dikelola ke objek terkelola. |
PtrToStructure(IntPtr, Type) |
Kedaluwarsa.
Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan. |
PtrToStructure<T>(IntPtr) |
Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan oleh parameter jenis generik. |
PtrToStructure<T>(IntPtr, T) |
Marshals data dari blok memori yang tidak dikelola ke objek terkelola dari jenis yang ditentukan. |
PtrToStructure(IntPtr, Object)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
Perhatian
PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512
Marshal data dari blok memori yang tidak dikelola ke objek terkelola.
public:
static void PtrToStructure(IntPtr ptr, System::Object ^ structure);
[System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")]
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
[<System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")>]
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * obj -> unit
static member PtrToStructure : nativeint * obj -> unit
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * obj -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * obj -> unit
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * obj -> unit
Public Shared Sub PtrToStructure (ptr As IntPtr, structure As Object)
Parameter
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola.
- structure
- Object
Objek tempat data akan disalin. Ini harus berupa instans kelas yang diformat.
- Atribut
Pengecualian
Tata letak struktur tidak berurutan atau eksplisit.
-atau-
Struktur adalah jenis nilai dalam kotak.
Keterangan
PtrToStructure sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda tidak dapat menggunakan metode kelebihan beban ini dengan jenis nilai.
ptr
Jika parameter sama dengan IntPtr.Zero, null
akan dikembalikan.
Berlaku untuk
PtrToStructure(IntPtr, Type)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
Perhatian
PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513
Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan.
public:
static System::Object ^ PtrToStructure(IntPtr ptr, Type ^ structureType);
[System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")]
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
public static object? PtrToStructure (IntPtr ptr, Type structureType);
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
public static object PtrToStructure (IntPtr ptr, Type structureType);
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
[<System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")>]
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * Type -> obj
static member PtrToStructure : nativeint * Type -> obj
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * Type -> obj
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * Type -> obj
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * Type -> obj
Public Shared Function PtrToStructure (ptr As IntPtr, structureType As Type) As Object
Parameter
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola.
- structureType
- Type
Jenis objek yang akan dibuat. Objek ini harus mewakili kelas atau struktur yang diformat.
Mengembalikan
Objek terkelola yang berisi data yang ditujukkan oleh ptr
parameter .
- Atribut
Pengecualian
Tata structureType
letak parameter tidak berurutan atau eksplisit.
-atau-
Parameter structureType
adalah definisi jenis generik.
structureType
adalah null
.
Kelas yang ditentukan oleh structureType
tidak memiliki konstruktor tanpa parameter yang dapat diakses.
Contoh
Contoh berikut membuat struktur terkelola, mentransfernya ke memori yang tidak dikelola, lalu mentransfernya kembali ke memori terkelola PtrToStructure menggunakan metode .
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
Contoh berikut menunjukkan cara melakukan marshal blok memori yang tidak dikelola ke struktur terkelola menggunakan PtrToStructure metode .
Penting
Kode ini mengasumsikan kompilasi 32-bit. Sebelum menggunakan pengkompilasi 64-bit, ganti IntPtr.ToInt32 dengan IntPtr.ToInt64.
[StructLayout(LayoutKind::Sequential)]
ref class INNER
{
public:
[MarshalAs(UnmanagedType::ByValTStr,SizeConst=10)]
String^ field;
INNER()
{
field = "Test";
}
};
[StructLayout(LayoutKind::Sequential)]
value struct OUTER
{
public:
[MarshalAs(UnmanagedType::ByValTStr,SizeConst=10)]
String^ field;
[MarshalAs(UnmanagedType::ByValArray,SizeConst=100)]
array<Byte>^ inner;
};
[DllImport("SomeTestDLL.dll")]
static void CallTest(OUTER^ outerStructurePointer);
void static Work()
{
OUTER outerStructure;
array<INNER^>^ innerArray = gcnew array<INNER^>(10);
INNER^ innerStructure = gcnew INNER;
int structSize = Marshal::SizeOf(innerStructure);
int size = innerArray->Length * structSize;
outerStructure.inner = gcnew array<Byte>(size);
try
{
CallTest(outerStructure);
}
catch (SystemException^ ex)
{
Console::WriteLine(ex->Message);
}
IntPtr buffer = Marshal::AllocCoTaskMem(structSize * 10);
Marshal::Copy(outerStructure.inner, 0, buffer, structSize * 10);
int currentOffset = 0;
for (int i = 0; i < 10; i++)
{
innerArray[i] = safe_cast<INNER^>(Marshal::PtrToStructure(
IntPtr(buffer.ToInt32() + currentOffset),
INNER::typeid));
currentOffset += structSize;
}
Console::WriteLine(outerStructure.field);
Marshal::FreeCoTaskMem(buffer);
}
[StructLayout(LayoutKind.Sequential)]
public class INNER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string field1 = "Test";
}
[StructLayout(LayoutKind.Sequential)]
public struct OUTER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
public string field1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
public byte[] inner;
}
[DllImport(@"SomeTestDLL.dll")]
public static extern void CallTest( ref OUTER po);
static void Main(string[] args)
{
OUTER ed = new OUTER();
INNER[] inn=new INNER[10];
INNER test = new INNER();
int iStructSize = Marshal.SizeOf(test);
int sz =inn.Length * iStructSize;
ed.inner = new byte[sz];
try
{
CallTest( ref ed);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);
Marshal.Copy(ed.inner,0,buffer,iStructSize*10);
int iCurOffset = 0;
for(int i=0;i<10;i++)
{
inn[i] = (INNER)Marshal.PtrToStructure(new
IntPtr(buffer.ToInt32()+iCurOffset),typeof(INNER) );
iCurOffset += iStructSize;
}
Console.WriteLine(ed.field1);
Marshal.FreeCoTaskMem(buffer);
}
Keterangan
PtrToStructure sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda dapat meneruskan jenis nilai ke metode kelebihan beban ini. Dalam hal ini, objek yang dikembalikan adalah instans kotak.
ptr
Jika parameter sama dengan IntPtr.Zero, null
akan dikembalikan.
Lihat juga
Berlaku untuk
PtrToStructure<T>(IntPtr)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan oleh parameter jenis generik.
public:
generic <typename T>
static T PtrToStructure(IntPtr ptr);
[System.Security.SecurityCritical]
public static T PtrToStructure<T> (IntPtr ptr);
public static T? PtrToStructure<T> (IntPtr ptr);
public static T PtrToStructure<T> (IntPtr ptr);
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint -> 'T
static member PtrToStructure : nativeint -> 'T
Public Shared Function PtrToStructure(Of T) (ptr As IntPtr) As T
Jenis parameter
- T
Jenis objek tempat data akan disalin. Ini harus merupakan kelas atau struktur yang diformat.
Parameter
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola.
Mengembalikan
Objek terkelola yang berisi data yang dituju ptr
parameter.
- Atribut
Pengecualian
Tata letak T
tidak berurutan atau eksplisit.
Kelas yang ditentukan oleh T
tidak memiliki konstruktor tanpa parameter yang dapat diakses.
Keterangan
PtrToStructure<T>(IntPtr) sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda dapat meneruskan jenis nilai ke metode ini kelebihan beban.
ptr
Jika parameter sama IntPtr.Zero dan T
merupakan jenis referensi, null
dikembalikan. Jika ptr
sama dengan IntPtr.Zero dan T
merupakan jenis nilai, akan NullReferenceException dilemparkan.
Berlaku untuk
PtrToStructure<T>(IntPtr, T)
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
- Sumber:
- Marshal.cs
Marshals data dari blok memori yang tidak dikelola ke objek terkelola dari jenis yang ditentukan.
public:
generic <typename T>
static void PtrToStructure(IntPtr ptr, T structure);
[System.Security.SecurityCritical]
public static void PtrToStructure<T> (IntPtr ptr, T structure);
public static void PtrToStructure<T> (IntPtr ptr, T structure);
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * 'T -> unit
static member PtrToStructure : nativeint * 'T -> unit
Public Shared Sub PtrToStructure(Of T) (ptr As IntPtr, structure As T)
Jenis parameter
- T
Jenis structure
. Ini harus merupakan kelas yang diformat.
Parameter
- ptr
-
IntPtr
nativeint
Penunjuk ke blok memori yang tidak dikelola.
- structure
- T
Objek tempat data akan disalin.
- Atribut
Pengecualian
Tata letak struktur tidak berurutan atau eksplisit.
Keterangan
PtrToStructure<T>(IntPtr, T) sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai IntPtr nilai. Anda tidak dapat menggunakan metode ini yang kelebihan beban dengan tipe nilai.
ptr
Jika parameter sama IntPtr.Zero dan T
merupakan jenis referensi, null
dikembalikan. Jika ptr
sama dengan IntPtr.Zero dan T
merupakan jenis nilai, akan NullReferenceException dilemparkan.