{"System.Runtime.Serialization.Formatters.Soap", 0},
{"System.Security", 0},
{"System.ServiceProcess", 0},
+ {"System.Transactions", 2},
{"System.Web", 0},
{"System.Web.Abstractions", 2},
- {"System.Web.Extensions", 2},
{"System.Web.Mobile", 0},
{"System.Web.Routing", 2},
{"System.Web.Services", 0},
return memcmp (pubt1, pubt2, 16) == 0;
}
+/* Native Client can't get this info from an environment variable so */
+/* it's passed in to the runtime, or set manually by embedding code. */
+#ifdef __native_client__
+char* nacl_mono_path = NULL;
+#endif
+
static void
check_path_env (void)
{
const char *path;
char **splitted, **dest;
+#ifdef __native_client__
+ path = nacl_mono_path;
+#else
path = g_getenv ("MONO_PATH");
+#endif
if (!path)
return;
config = g_build_filename (base, "etc", NULL);
lib = g_build_filename (base, "lib", NULL);
- mono = g_build_filename (lib, "mono/1.0", NULL);
+ mono = g_build_filename (lib, "mono/2.0", NULL);
if (stat (mono, &buf) == -1)
fallback ();
else {
fallback ();
return;
}
-
- name = mono_path_resolve_symlinks (name);
}
#endif
char*
mono_stringify_assembly_name (MonoAssemblyName *aname)
{
+ const char *quote = (aname->name && g_ascii_isspace (aname->name [0])) ? "\"" : "";
+
return g_strdup_printf (
- "%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s",
- aname->name,
+ "%s%s%s, Version=%d.%d.%d.%d, Culture=%s, PublicKeyToken=%s%s",
+ quote, aname->name, quote,
aname->major, aname->minor, aname->build, aname->revision,
aname->culture && *aname->culture? aname->culture: "neutral",
aname->public_key_token [0] ? (char *)aname->public_key_token : "null",
if (reference != REFERENCE_MISSING){
mono_assembly_addref (reference);
if (image->assembly)
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s %p -> %s %p: %d",
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Assembly Ref addref %s[%p] -> %s[%p]: %d",
image->assembly->aname.name, image->assembly, reference->aname.name, reference, reference->ref_count);
} else {
if (image->assembly)
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s %p\n",
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Failed to load assembly %s[%p]\n",
image->assembly->aname.name, image->assembly);
}
/* Add a non-temporary reference because of ass->image */
mono_image_addref (image);
- mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Image addref %s %p -> %s %p: %d", ass->aname.name, ass, image->name, image, image->ref_count);
+ mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_ASSEMBLY, "Image addref %s[%p] -> %s[%p]: %d", ass->aname.name, ass, image->name, image, image->ref_count);
/*
* The load hooks might take locks so we can't call them while holding the
keylen = strlen (key) >> 1;
if (keylen < 1)
return FALSE;
-
+
+ /* allow the ECMA standard key */
+ if (strcmp (key, "00000000000000000400000000000000") == 0) {
+ if (pubkey) {
+ arr = g_strdup ("b77a5c561934e089");
+ *pubkey = arr;
+ }
+ return TRUE;
+ }
val = g_ascii_xdigit_value (key [0]) << 4;
val |= g_ascii_xdigit_value (key [1]);
switch (val) {
}
static gboolean
-build_assembly_name (const char *name, const char *version, const char *culture, const char *token, const char *key, guint32 flags, MonoAssemblyName *aname, gboolean save_public_key)
+build_assembly_name (const char *name, const char *version, const char *culture, const char *token, const char *key, guint32 flags, guint32 arch, MonoAssemblyName *aname, gboolean save_public_key)
{
gint major, minor, build, revision;
gint len;
}
aname->flags = flags;
+ aname->arch = arch;
aname->name = g_strdup (name);
if (culture) {
return FALSE;
}
- res = build_assembly_name (name, parts[0], parts[1], parts[2], NULL, 0, aname, FALSE);
+ res = build_assembly_name (name, parts[0], parts[1], parts[2], NULL, 0, 0, aname, FALSE);
g_strfreev (parts);
return res;
}
gboolean version_defined;
gboolean token_defined;
guint32 flags = 0;
+ guint32 arch = PROCESSOR_ARCHITECTURE_NONE;
if (!is_version_defined)
is_version_defined = &version_defined;
}
if (!g_ascii_strncasecmp (value, "ProcessorArchitecture=", 22)) {
- /* this is ignored for now, until we can change MonoAssemblyName */
+ char *s = g_strstrip (value + 22);
+ if (!g_ascii_strcasecmp (s, "None"))
+ arch = PROCESSOR_ARCHITECTURE_NONE;
+ else if (!g_ascii_strcasecmp (s, "MSIL"))
+ arch = PROCESSOR_ARCHITECTURE_MSIL;
+ else if (!g_ascii_strcasecmp (s, "X86"))
+ arch = PROCESSOR_ARCHITECTURE_X86;
+ else if (!g_ascii_strcasecmp (s, "IA64"))
+ arch = PROCESSOR_ARCHITECTURE_IA64;
+ else if (!g_ascii_strcasecmp (s, "AMD64"))
+ arch = PROCESSOR_ARCHITECTURE_AMD64;
+ else
+ goto cleanup_and_fail;
tmp++;
continue;
}
goto cleanup_and_fail;
}
- res = build_assembly_name (dllname, version, culture, token, key, flags,
+ res = build_assembly_name (dllname, version, culture, token, key, flags, arch,
aname, save_public_key);
g_strfreev (parts);
return res;
mono_loader_lock ();
mono_domain_lock (domain);
- info = get_per_domain_assembly_binding_info (domain, aname);
+ info2 = get_per_domain_assembly_binding_info (domain, aname);
+
+ if (info2) {
+ info = g_memdup (info2, sizeof (MonoAssemblyBindingInfo));
+ info->name = g_strdup (info2->name);
+ info->culture = g_strdup (info2->culture);
+ info->domain_id = domain->domain_id;
+ }
+
mono_domain_unlock (domain);
mono_loader_unlock ();
}
mono_assembly_load_corlib (const MonoRuntimeInfo *runtime, MonoImageOpenStatus *status)
{
char *corlib_file;
+ MonoAssemblyName *aname;
if (corlib) {
/* g_print ("corlib already loaded\n"); */
return corlib;
}
#endif
-
+
+ aname = mono_assembly_name_new ("mscorlib.dll");
+ corlib = invoke_assembly_preload_hook (aname, assemblies_path);
+ mono_assembly_name_free (aname);
+ g_free (aname);
+ if (corlib != NULL)
+ return corlib;
+
if (assemblies_path) {
corlib = load_in_path ("mscorlib.dll", (const char**)assemblies_path, status, FALSE);
if (corlib)
free_assembly_preload_hooks ();
}
+/*LOCKING assumes loader lock is held*/
+void
+mono_assembly_cleanup_domain_bindings (guint32 domain_id)
+{
+ GSList **iter = &loaded_assembly_bindings;
+
+ while (*iter) {
+ GSList *l = *iter;
+ MonoAssemblyBindingInfo *info = l->data;
+
+ if (info->domain_id == domain_id) {
+ *iter = l->next;
+ mono_assembly_binding_info_free (info);
+ g_free (info);
+ g_slist_free_1 (l);
+ } else {
+ iter = &l->next;
+ }
+ }
+}
+
/*
* Holds the assembly of the application, for
* System.Diagnostics.Process::MainModule