Merge pull request #496 from nicolas-raoul/unit-test-for-issue2907
[mono.git] / mono / metadata / assembly.c
index 014e5338a9582b6df651a63d07e8812caa77614d..78caa2c2a2f4ddf6267d2a329e763c308389dd4a 100644 (file)
@@ -6,6 +6,7 @@
  *
  * Copyright 2001-2003 Ximian, Inc (http://www.ximian.com)
  * Copyright 2004-2009 Novell, Inc (http://www.novell.com)
+ * Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
  */
 #include <config.h>
 #include <stdio.h>
@@ -113,6 +114,7 @@ static const AssemblyVersionMap framework_assemblies [] = {
        {"System.Management", 0},
        {"System.Messaging", 0},
        {"System.Runtime.Remoting", 0},
+       {"System.Runtime.Serialization", 3},
        {"System.Runtime.Serialization.Formatters.Soap", 0},
        {"System.Security", 0},
        {"System.ServiceProcess", 0},
@@ -584,7 +586,7 @@ fallback (void)
        mono_set_dirs (MONO_ASSEMBLIES, MONO_CFG_DIR);
 }
 
-static void
+static G_GNUC_UNUSED void
 set_dirs (char *exe)
 {
        char *base;
@@ -839,8 +841,37 @@ mono_assembly_remap_version (MonoAssemblyName *aname, MonoAssemblyName *dest_ana
        int pos, first, last;
 
        if (aname->name == NULL) return aname;
+
        current_runtime = mono_get_runtime_info ();
 
+       if (aname->flags & ASSEMBLYREF_RETARGETABLE_FLAG) {
+               const AssemblyVersionSet* vset;
+
+               /* Remap to current runtime */
+               vset = &current_runtime->version_sets [0];
+
+               memcpy (dest_aname, aname, sizeof(MonoAssemblyName));
+               dest_aname->major = vset->major;
+               dest_aname->minor = vset->minor;
+               dest_aname->build = vset->build;
+               dest_aname->revision = vset->revision;
+               dest_aname->flags &= ~ASSEMBLYREF_RETARGETABLE_FLAG;
+
+               /* Remap assembly name */
+               if (!strcmp (aname->name, "System.Net"))
+                       dest_aname->name = g_strdup ("System");
+
+               mono_trace (G_LOG_LEVEL_WARNING, MONO_TRACE_ASSEMBLY,
+                                       "The request to load the retargetable assembly %s v%d.%d.%d.%d was remapped to %s v%d.%d.%d.%d",
+                                       aname->name,
+                                       aname->major, aname->minor, aname->build, aname->revision,
+                                       dest_aname->name,
+                                       vset->major, vset->minor, vset->build, vset->revision
+                                       );
+
+               return dest_aname;
+       }
+
        first = 0;
        last = G_N_ELEMENTS (framework_assemblies) - 1;
        
@@ -2861,6 +2892,21 @@ mono_assembly_loaded (MonoAssemblyName *aname)
        return mono_assembly_loaded_full (aname, FALSE);
 }
 
+void
+mono_assembly_release_gc_roots (MonoAssembly *assembly)
+{
+       if (assembly == NULL || assembly == REFERENCE_MISSING)
+               return;
+
+       if (assembly->dynamic) {
+               int i;
+               MonoDynamicImage *dynimg = (MonoDynamicImage *)assembly->image;
+               for (i = 0; i < dynimg->image.module_count; ++i)
+                       mono_dynamic_image_release_gc_roots ((MonoDynamicImage *)dynimg->image.modules [i]);
+               mono_dynamic_image_release_gc_roots (dynimg);
+       }
+}
+
 /*
  * Returns whether mono_assembly_close_finish() must be called as
  * well.  See comment for mono_image_close_except_pools() for why we