本帖最后由 CCDDzclxy 于 2013-04-09 10:57:22 编辑

解决方案 »

  1.   

    MarshalAs特性是用来管PInvoke‘封送’的,只要在进行封送的时候才有用。
    Marshal.SizeOf是指封送时,系统封送数据的大小。要传入数据,是要用new来分配:
    Test t = new Test();
    t.buf = new byte[20];
    BitConverter.GetBytes((int)100).CopyTo(t.buf, 0);
      

  2.   

    还是不太懂...
    你 t.buf = new byte[20]; 这里分配的内存是在哪里的?就是在 Test 的 buf上的??还是在别的地方另外申请的内存?
      

  3.   

    t.buf = new byte[40]; 这里分配的内存就是托管内存。在调用DllImport的时候,系统要帮你准备好非托管内存以便调用dll,因为非托管dll不理解托管内存。
    这时,系统就要检查MarshalAs特性,把buf封送(可以是拷贝)到长度为16的一段非托管内存中。buf剩下的内容,可能就被忽略了。
      

  4.   

    哦~ 有这样一个过程啊~~那如果API函数有对 t.buf 进行写操作的话,是否也是需要在调用 API之前 new一下 ?然后API调用结束后,系统会将 非托管内存 中的数据 复制到 托管内存中 ?