- guint32 raw_assembly_len = mono_array_length (raw_assembly);
- MonoImage *image = mono_image_open_from_data_full (mono_array_addr (raw_assembly, gchar, 0), raw_assembly_len, TRUE, NULL, refonly);
+ guint32 raw_assembly_len = mono_array_handle_length (raw_assembly);
+
+ /* Copy the data ourselves to unpin the raw assembly byte array as soon as possible */
+ char *assembly_data = (char*) g_try_malloc (raw_assembly_len);
+ if (!assembly_data) {
+ mono_error_set_out_of_memory (error, "Could not allocate %ud bytes to copy raw assembly data", raw_assembly_len);
+ return refass;
+ }
+ uint32_t gchandle;
+ mono_byte *raw_data = (mono_byte*) MONO_ARRAY_HANDLE_PIN (raw_assembly, gchar, 0, &gchandle);
+ memcpy (assembly_data, raw_data, raw_assembly_len);
+ mono_gchandle_free (gchandle); /* unpin */
+ MONO_HANDLE_ASSIGN (raw_assembly, NULL_HANDLE); /* don't reference the data anymore */
+
+ MonoImage *image = mono_image_open_from_data_full (assembly_data, raw_assembly_len, FALSE, NULL, refonly);