托管,非托管相互转换

Marshal.PtrToStructure 方法 (IntPtr, Type)

将数据从非托管内存块封送到新分配的指定类型的托管对象。

参数
ptr

指向非托管内存块的指针。

structureType

要创建的对象的 。此类型对象必须表示格式化类或结构。

返回值

一个托管对象,包含 ptr 参数指向的数据。

 

示例

 

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

  }

转载于:https://www.cnblogs.com/goodyao/archive/2008/07/22/1248615.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值