MarshalAs特性是用来管PInvoke‘封送’的,只要在进行封送的时候才有用。 Marshal.SizeOf是指封送时,系统封送数据的大小。要传入数据,是要用new来分配: Test t = new Test(); t.buf = new byte[20]; BitConverter.GetBytes((int)100).CopyTo(t.buf, 0);
还是不太懂... 你 t.buf = new byte[20]; 这里分配的内存是在哪里的?就是在 Test 的 buf上的??还是在别的地方另外申请的内存?
t.buf = new byte[40]; 这里分配的内存就是托管内存。在调用DllImport的时候,系统要帮你准备好非托管内存以便调用dll,因为非托管dll不理解托管内存。 这时,系统就要检查MarshalAs特性,把buf封送(可以是拷贝)到长度为16的一段非托管内存中。buf剩下的内容,可能就被忽略了。
Marshal.SizeOf是指封送时,系统封送数据的大小。要传入数据,是要用new来分配:
Test t = new Test();
t.buf = new byte[20];
BitConverter.GetBytes((int)100).CopyTo(t.buf, 0);
你 t.buf = new byte[20]; 这里分配的内存是在哪里的?就是在 Test 的 buf上的??还是在别的地方另外申请的内存?
这时,系统就要检查MarshalAs特性,把buf封送(可以是拷贝)到长度为16的一段非托管内存中。buf剩下的内容,可能就被忽略了。