public static FabricTransportMessage ToFabricTransportMessage(
            NativeFabricTransport.IFabricTransportMessage message)
        {
            FabricTransportMessage msg;
            uint   count;
            IntPtr headerBuffer;
            IntPtr messageBuffer;

            message.GetHeaderAndBodyBuffer(out headerBuffer,
                                           out count,
                                           out messageBuffer);
            if (headerBuffer != IntPtr.Zero)
            {
                msg =
                    new FabricTransportMessage(
                        NativeMessageToFabricTransportHeader(headerBuffer),
                        NativeMessageToFabricTransportBody(count, messageBuffer),
                        message);
            }
            else
            {
                msg = new FabricTransportMessage(null,
                                                 NativeMessageToFabricTransportBody(count, messageBuffer),
                                                 message);
            }

            GC.KeepAlive(message);
            return(msg);
        }
        public NativeFabricTransportMessage(FabricTransportMessage message)
        {
            this.message = message;
            // Create pinned objects for header and body.
            this.pin = new PinCollection();
            var nativeHeaderBuffer = this.CreateNativeHeaderBytes();

            this.nativeHeadersPtr     = this.pin.AddBlittable(nativeHeaderBuffer);
            this.nativeBodyBuffersPtr = this.CreateNativeBodyBytesPtr();
        }