MemoryBuffer.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System;
  2. using System.IO;
  3. using System.Runtime.InteropServices;
  4. namespace Urho
  5. {
  6. public unsafe class MemoryBuffer : IDeserializer, ISerializer, IDisposable
  7. {
  8. [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)]
  9. static extern IntPtr MemoryBuffer_MemoryBuffer(byte* data, int size);
  10. [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)]
  11. static extern IntPtr MemoryBuffer_GetData(IntPtr handle, out int data);
  12. [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)]
  13. static extern IntPtr MemoryBuffer_Dispose(IntPtr handle);
  14. public MemoryBuffer(byte[] data)
  15. {
  16. fixed (byte* bptr = data)
  17. {
  18. Handle = MemoryBuffer_MemoryBuffer(bptr, data.Length);
  19. }
  20. }
  21. public MemoryBuffer(MemoryStream ms) : this(ms.ToArray()) { }
  22. public MemoryBuffer(IntPtr handle) { Handle = handle; }
  23. public IntPtr Handle { get; private set; }
  24. public byte[] GetData()
  25. {
  26. int size;
  27. var bytesPtr = MemoryBuffer_GetData(Handle, out size);
  28. byte[] result = new byte[size];
  29. Marshal.Copy(bytesPtr, result, 0, size);
  30. return result;
  31. }
  32. public void Dispose()
  33. {
  34. MemoryBuffer_Dispose(Handle);
  35. GC.SuppressFinalize(this);
  36. }
  37. ~MemoryBuffer()
  38. {
  39. Dispose();
  40. }
  41. }
  42. }