本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

Marshal.PtrToStructure 方法 (IntPtr, Type)

 

從 Unmanaged 記憶體區塊封送處理資料到新配置的指定類型的 Managed 物件。

命名空間:   System.Runtime.InteropServices
組件:  mscorlib (於 mscorlib.dll)

[SecurityCriticalAttribute]
[ComVisibleAttribute(true)]
public static object PtrToStructure(
	IntPtr ptr,
	Type structureType
)

參數

ptr
Type: System.IntPtr

Unmanaged 記憶體區塊的指標。

structureType
Type: System.Type

要建立的物件類型。 這個物件必須表示格式化類別或結構。

傳回值

Type: System.Object

包含資料的 managed 的物件所指 ptr 參數。

Exception Condition
ArgumentException

structureType 參數配置不會循序或明確。

-或-

structureType 參數為泛型型別。

ArgumentNullException

structureTypenull

MissingMethodException

指定的類別 structureType 沒有存取的預設建構函式。

PtrToStructure 通常是必要的 COM interop 和平台叫用時結構參數會表示為 System.IntPtr 的值。 您可以將實值型別傳遞至這個多載方法。 在此情況下,傳回的物件是已封裝的執行個體。

下列範例會建立受管理的結構、 將它傳送至 unmanaged 記憶體中,然後將其傳送回 managed 的記憶體使用 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);
        }



    }

}

下列範例示範如何封送處理 unmanaged 的記憶體區塊的 managed 的結構使用 PtrToStructure 方法。

System_CAPS_important重要

此程式碼假設 32 位元編譯。 之前使用 64 位元編譯器,取代 IntPtr.ToInt32IntPtr.ToInt64


		[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);

		}

SecurityCriticalAttribute

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

通用 Windows 平台
自 8 起供應
.NET Framework
自 1.1 起供應
可攜式類別庫
提供支援︰ 可攜式 .NET 平台
Silverlight
自 2.0 起供應
Windows Phone Silverlight
自 7.0 起供應
Windows Phone
自 8.1 起供應
回到頁首
顯示: