/* * Note that we call it is_socket_type() where 'socket' refers to the image * that contains the System.Net.Sockets.Socket type. * For moonlight there is a System.Net.Sockets.Socket class in both System.dll and System.Net.dll. */ static gboolean is_socket_type (MonoDomain *domain, MonoClass *klass) { static const char *version = NULL; static gboolean moonlight; if (is_system_type (domain, klass)) return TRUE; /* If moonlight, check if the type is in System.Net.dll too */ if (version == NULL) { version = mono_get_runtime_info ()->framework_version; moonlight = !strcmp (version, "2.1"); } if (!moonlight) return FALSE; if (domain->system_net_dll == NULL) domain->system_net_dll = mono_image_loaded ("System.Net"); return klass->image == domain->system_net_dll; }
MonoDynamicImage* mono_dynamic_image_create (MonoDynamicAssembly *assembly, char *assembly_name, char *module_name) { static const guchar entrycode [16] = {0xff, 0x25, 0}; MonoDynamicImage *image; int i; const char *version; if (!strcmp (mono_get_runtime_info ()->framework_version, "2.1")) version = "v2.0.50727"; /* HACK: SL 2 enforces the .net 2 metadata version */ else version = mono_get_runtime_info ()->runtime_version; image = g_new0 (MonoDynamicImage, 1); MONO_PROFILER_RAISE (image_loading, (&image->image)); /*g_print ("created image %p\n", image);*/ /* keep in sync with image.c */ image->image.name = assembly_name; image->image.assembly_name = image->image.name; /* they may be different */ image->image.module_name = module_name; image->image.version = g_strdup (version); image->image.md_version_major = 1; image->image.md_version_minor = 1; image->image.dynamic = TRUE; image->image.references = g_new0 (MonoAssembly*, 1); image->image.references [0] = NULL; mono_image_init (&image->image); image->token_fixups = mono_g_hash_table_new_type ((GHashFunc)mono_object_hash, NULL, MONO_HASH_KEY_GC, MONO_ROOT_SOURCE_REFLECTION, NULL, "Reflection Dynamic Image Token Fixup Table"); image->method_to_table_idx = g_hash_table_new (NULL, NULL); image->field_to_table_idx = g_hash_table_new (NULL, NULL); image->method_aux_hash = g_hash_table_new (NULL, NULL); image->vararg_aux_hash = g_hash_table_new (NULL, NULL); image->handleref = g_hash_table_new (NULL, NULL); image->tokens = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_REFLECTION, NULL, "Reflection Dynamic Image Token Table"); image->generic_def_objects = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_REFLECTION, NULL, "Reflection Dynamic Image Generic Definition Table"); image->typespec = g_hash_table_new ((GHashFunc)mono_metadata_type_hash, (GCompareFunc)mono_metadata_type_equal); image->typeref = g_hash_table_new ((GHashFunc)mono_metadata_type_hash, (GCompareFunc)mono_metadata_type_equal); image->blob_cache = g_hash_table_new ((GHashFunc)mono_blob_entry_hash, (GCompareFunc)mono_blob_entry_equal); image->gen_params = g_ptr_array_new (); image->remapped_tokens = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC, MONO_ROOT_SOURCE_REFLECTION, NULL, "Reflection Dynamic Image Remapped Token Table"); /*g_print ("string heap create for image %p (%s)\n", image, module_name);*/ string_heap_init (&image->sheap); mono_dynstream_add_data (&image->us, "", 1); mono_dynamic_image_add_to_blob_cached (image, (char*) "", 1, NULL, 0); /* import tables... */ mono_dynstream_add_data (&image->code, (char*)entrycode, sizeof (entrycode)); image->iat_offset = mono_dynstream_add_zero (&image->code, 8); /* two IAT entries */ image->idt_offset = mono_dynstream_add_zero (&image->code, 2 * sizeof (MonoIDT)); /* two IDT entries */ image->imp_names_offset = mono_dynstream_add_zero (&image->code, 2); /* flags for name entry */ mono_dynstream_add_data (&image->code, "_CorExeMain", 12); mono_dynstream_add_data (&image->code, "mscoree.dll", 12); image->ilt_offset = mono_dynstream_add_zero (&image->code, 8); /* two ILT entries */ mono_dynstream_data_align (&image->code); image->cli_header_offset = mono_dynstream_add_zero (&image->code, sizeof (MonoCLIHeader)); for (i=0; i < MONO_TABLE_NUM; ++i) { image->tables [i].next_idx = 1; image->tables [i].columns = table_sizes [i]; } image->image.assembly = (MonoAssembly*)assembly; image->run = assembly->run; image->save = assembly->save; image->pe_kind = 0x1; /* ILOnly */ image->machine = 0x14c; /* I386 */ MONO_PROFILER_RAISE (image_loaded, (&image->image)); dynamic_images_lock (); if (!dynamic_images) dynamic_images = g_ptr_array_new (); g_ptr_array_add (dynamic_images, image); dynamic_images_unlock (); return image; }