private TypeDesc EmitSafeHandleMarshalling(TypeDesc type)
        {
            var safeHandleType = this.SafeHandleType;

            var vAddRefed   = _emitter.NewLocal(_context.GetWellKnownType(WellKnownType.Boolean));
            var vSafeHandle = _emitter.NewLocal(type);

            _marshallingCodeStream.EmitStLoc(vSafeHandle);

            _marshallingCodeStream.EmitLdLoc(vSafeHandle);
            _marshallingCodeStream.EmitLdLoca(vAddRefed);
            _marshallingCodeStream.Emit(ILOpcode.call, _emitter.NewToken(
                                            safeHandleType.GetKnownMethod("DangerousAddRef", null)));

            _marshallingCodeStream.EmitLdLoc(vSafeHandle);
            _marshallingCodeStream.Emit(ILOpcode.call, _emitter.NewToken(
                                            safeHandleType.GetKnownMethod("DangerousGetHandle", null)));

            // TODO: This should be inside finally block and only executed it the handle was addrefed
            _unmarshallingCodestream.EmitLdLoc(vSafeHandle);
            _unmarshallingCodestream.Emit(ILOpcode.call, _emitter.NewToken(
                                              safeHandleType.GetKnownMethod("DangerousRelease", null)));

            return(_context.GetWellKnownType(WellKnownType.IntPtr));
        }