using System;
using System.Drawing;
using System.Runtime.InteropServices;
internal class GCBuffer : SafeBuffer {
protected GCHandle gch;
public GCBuffer(object value)
: base(true) {
gch = GCHandle.Alloc(value, GCHandleType.Pinned);
handle = gch.AddrOfPinnedObject();
}
protected override bool ReleaseHandle() {
gch.Free();
return !gch.IsAllocated;
}
public static void Main(string[] args) {
var bytes = new byte[] {
0x01, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00,
};
using(var buffer = new GCBuffer(bytes)) {
buffer.Initialize<byte>((uint)bytes.Length);
Console.WriteLine(buffer.Read<Rectangle>(0ul));
buffer.Write(0ul, new Point(-1, -2));
buffer.ReadArray(0ul, bytes, 0, bytes.Length);
Console.WriteLine(BitConverter.ToString(bytes));
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRHJhd2luZzsKdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKaW50ZXJuYWwgY2xhc3MgR0NCdWZmZXIgOiBTYWZlQnVmZmVyIHsKCXByb3RlY3RlZCBHQ0hhbmRsZSBnY2g7CglwdWJsaWMgR0NCdWZmZXIob2JqZWN0IHZhbHVlKQoJCTogYmFzZSh0cnVlKSB7CgkJZ2NoID0gR0NIYW5kbGUuQWxsb2ModmFsdWUsIEdDSGFuZGxlVHlwZS5QaW5uZWQpOwoJCWhhbmRsZSA9IGdjaC5BZGRyT2ZQaW5uZWRPYmplY3QoKTsKCX0KCglwcm90ZWN0ZWQgb3ZlcnJpZGUgYm9vbCBSZWxlYXNlSGFuZGxlKCkgewoJCWdjaC5GcmVlKCk7CgkJcmV0dXJuICFnY2guSXNBbGxvY2F0ZWQ7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpIHsKCQl2YXIgYnl0ZXMgPSBuZXcgYnl0ZVtdIHsKCQkJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKCQkJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKCQkJMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKCQkJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKCQl9OwoJCXVzaW5nKHZhciBidWZmZXIgPSBuZXcgR0NCdWZmZXIoYnl0ZXMpKSB7CgkJCWJ1ZmZlci5Jbml0aWFsaXplPGJ5dGU+KCh1aW50KWJ5dGVzLkxlbmd0aCk7CgkJCUNvbnNvbGUuV3JpdGVMaW5lKGJ1ZmZlci5SZWFkPFJlY3RhbmdsZT4oMHVsKSk7CgkJCWJ1ZmZlci5Xcml0ZSgwdWwsIG5ldyBQb2ludCgtMSwgLTIpKTsKCQkJYnVmZmVyLlJlYWRBcnJheSgwdWwsIGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOwoJCQlDb25zb2xlLldyaXRlTGluZShCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoYnl0ZXMpKTsKCQl9Cgl9Cn0=