MemoryBuffer.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 uint MemoryBuffer_GetSize(IntPtr handle);
  14. [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)]
  15. static extern IntPtr MemoryBuffer_Dispose(IntPtr handle);
  16. public MemoryBuffer(byte[] data)
  17. {
  18. fixed (byte* bptr = data)
  19. {
  20. Handle = MemoryBuffer_MemoryBuffer(bptr, data.Length);
  21. }
  22. }
  23. public MemoryBuffer(MemoryStream ms) : this(ms.ToArray()) { }
  24. public MemoryBuffer(IntPtr handle) { Handle = handle; }
  25. public IntPtr Handle { get; private set; }
  26. public uint Size => MemoryBuffer_GetSize(Handle);
  27. public byte[] GetData()
  28. {
  29. int size;
  30. var bytesPtr = MemoryBuffer_GetData(Handle, out size);
  31. if (bytesPtr == IntPtr.Zero)
  32. return new byte[0];
  33. byte[] result = new byte[size];
  34. Marshal.Copy(bytesPtr, result, 0, size);
  35. return result;
  36. }
  37. public void Dispose()
  38. {
  39. MemoryBuffer_Dispose(Handle);
  40. GC.SuppressFinalize(this);
  41. }
  42. ~MemoryBuffer()
  43. {
  44. Dispose();
  45. }
  46. }
  47. }