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)); }