Hi.
I've implemented two methods:
System.Reflection.Assembly.GetModules()
System.Reflection.Assembly.GetReferencedAssemblies()
GetModules implementation is not complete, because i couldn't find, how
to make a difference between resource modules and other kind of modules.
System.Reflection.Module.IsResource is unimplemented.
I've attached patches and a simple test program. I'm bit suspicious of
my mono_assemblyname_get_object & mono_module_get_object
implementations. I'm not sure, how those are supposed to be implemented.
Tomi.
Index: class/corlib/System.Reflection/Assembly.cs
===================================================================
RCS file: /mono/mcs/class/corlib/System.Reflection/Assembly.cs,v
retrieving revision 1.29
diff -u -r1.29 Assembly.cs
--- class/corlib/System.Reflection/Assembly.cs 21 Aug 2002 11:04:50 -0000 1.29
+++ class/corlib/System.Reflection/Assembly.cs 26 Aug 2002 19:13:42 -0000
@@ -282,9 +282,12 @@
throw new NotImplementedException ();
}
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ public extern Module[] GetModules (bool include_resources);
+
public Module[] GetModules ()
{
- throw new NotImplementedException ();
+ return GetModules (true);
}
public Module GetModule (String name)
@@ -301,10 +304,8 @@
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static Assembly GetCallingAssembly ();
- public AssemblyName[] GetReferencedAssemblies ()
- {
- throw new NotImplementedException ();
- }
+ [MethodImplAttribute (MethodImplOptions.InternalCall)]
+ public extern AssemblyName[] GetReferencedAssemblies ();
public virtual ManifestResourceInfo GetManifestResourceInfo (String resourceName)
{
Index: mono/metadata/icall.c
===================================================================
RCS file: /mono/mono/mono/metadata/icall.c,v
retrieving revision 1.198
diff -u -r1.198 icall.c
--- mono/metadata/icall.c 24 Aug 2002 16:48:44 -0000 1.198
+++ mono/metadata/icall.c 25 Aug 2002 20:04:26 -0000
@@ -2032,6 +2032,33 @@
}
+static MonoArray*
+ves_icall_System_Reflection_Assembly_GetReferencedAssemblies (MonoReflectionAssembly *assembly)
+{
+ MonoDomain *domain = mono_domain_get();
+ MonoArray *res;
+ MonoClass *klass;
+ int i, count = 0;
+ MonoAssembly **refs = assembly->assembly->image->references;
+
+ if (refs)
+ {
+ while (refs[count])
+ ++count;
+ }
+
+ klass = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "AssemblyName");
+
+ res = mono_array_new (domain, klass, count);
+
+ for ( i = 0; i < count; ++i )
+ mono_array_set (res, gpointer, i, mono_assemblyname_get_object (domain, &refs[i]->aname));
+
+ return res;
+}
+
+
+
static MonoReflectionAssembly*
ves_icall_System_Reflection_Assembly_GetCallingAssembly (void)
{
@@ -2043,6 +2070,35 @@
return mono_assembly_get_object (mono_domain_get (), dest->klass->image->assembly);
}
+static MonoArray*
+ves_icall_System_Reflection_Assembly_GetModules (MonoReflectionAssembly* assembly, MonoBoolean include_resource_modules )
+{
+ MonoDomain *domain = mono_domain_get();
+ MonoArray *res;
+ MonoClass *klass;
+ int i, count = 0;
+ MonoImage **modules = assembly->assembly->modules;
+
+ if (modules)
+ {
+ while (modules[count])
+ ++count;
+ }
+
+ g_assert( assembly->assembly->image != NULL );
+ ++count;
+
+ klass = mono_class_from_name ( mono_defaults.corlib, "System.Reflection", "Module");
+ res = mono_array_new (domain, klass, count);
+
+ mono_array_set (res, gpointer, 0, mono_module_get_object (domain, assembly->assembly->image));
+ for ( i = 1; i < count; ++i )
+ mono_array_set (res, gpointer, i, mono_module_get_object (domain, modules[i]));
+
+ return res;
+}
+
+
static MonoString *
ves_icall_System_MonoType_getFullName (MonoReflectionType *object)
{
@@ -2865,8 +2921,10 @@
"System.Reflection.Assembly::FillName", ves_icall_System_Reflection_Assembly_FillName,
"System.Reflection.Assembly::get_code_base", ves_icall_System_Reflection_Assembly_get_code_base,
"System.Reflection.Assembly::GetExecutingAssembly", ves_icall_System_Reflection_Assembly_GetExecutingAssembly,
+ "System.Reflection.Assembly::GetReferencedAssemblies", ves_icall_System_Reflection_Assembly_GetReferencedAssemblies,
"System.Reflection.Assembly::GetEntryAssembly", ves_icall_System_Reflection_Assembly_GetEntryAssembly,
"System.Reflection.Assembly::GetCallingAssembly", ves_icall_System_Reflection_Assembly_GetCallingAssembly,
+ "System.Reflection.Assembly::GetModules", ves_icall_System_Reflection_Assembly_GetModules,
"System.Reflection.Assembly::get_EntryPoint", ves_icall_System_Reflection_Assembly_get_EntryPoint,
"System.Reflection.Assembly::GetManifestResourceNames", ves_icall_System_Reflection_Assembly_GetManifestResourceNames,
"System.Reflection.Assembly::GetManifestResourceInternal", ves_icall_System_Reflection_Assembly_GetManifestResourceInternal,
Index: mono/metadata/reflection.c
===================================================================
RCS file: /mono/mono/mono/metadata/reflection.c,v
retrieving revision 1.106
diff -u -r1.106 reflection.c
--- mono/metadata/reflection.c 14 Aug 2002 15:40:31 -0000 1.106
+++ mono/metadata/reflection.c 25 Aug 2002 20:04:27 -0000
@@ -2692,6 +2692,62 @@
return res;
}
+
+/*
+ * mono_assemblyname_get_object:
+ * @domain: an app domain
+ * @assembly: an assembly_name
+ *
+ * Return an System.Reflection.AssemblyName object representing the MonoAssemblyName @assembly_name.
+ */
+MonoReflectionAssemblyName*
+mono_assemblyname_get_object (MonoDomain *domain, MonoAssemblyName *assembly_name)
+{
+ static MonoClass *System_Reflection_AssemblyName;
+ MonoReflectionAssemblyName *res;
+
+ CHECK_OBJECT (MonoReflectionAssemblyName *, assembly_name, NULL);
+ if (!System_Reflection_AssemblyName)
+ System_Reflection_AssemblyName = mono_class_from_name (
+ mono_defaults.corlib, "System.Reflection", "AssemblyName");
+ res = (MonoReflectionAssemblyName *)mono_object_new (domain, System_Reflection_AssemblyName);
+
+ res->name = mono_string_new (domain, assembly_name->name);
+ res->codebase = NULL; /* FIXME */
+
+ res->major = assembly_name->major;
+ res->minor = assembly_name->minor;
+ res->build = assembly_name->build;
+ res->revision = assembly_name->revision;
+
+ CACHE_OBJECT (assembly_name, res, NULL);
+ return res;
+}
+
+MonoReflectionModule*
+mono_module_get_object (MonoDomain *domain, MonoImage *image)
+{
+ static MonoClass *System_Reflection_Module;
+ MonoReflectionModule *res;
+
+ CHECK_OBJECT (MonoReflectionModule *, image, NULL);
+ if (!System_Reflection_Module)
+ System_Reflection_Module = mono_class_from_name (
+ mono_defaults.corlib, "System.Reflection", "Module");
+ res = (MonoReflectionModule *)mono_object_new (domain, System_Reflection_Module);
+
+ res->image = image;
+ res->assembly = (MonoReflectionAssembly *) mono_assembly_get_object(domain, image->assembly);
+
+ res->fqname = mono_string_new (domain, image->name);
+ res->name = mono_string_new (domain, image->name);
+ res->scopename = mono_string_new (domain, image->module_name);
+
+ CACHE_OBJECT (image, res, NULL);
+ return res;
+}
+
+
static gboolean
mymono_metadata_type_equal (MonoType *t1, MonoType *t2)
{
Index: mono/metadata/reflection.h
===================================================================
RCS file: /mono/mono/mono/metadata/reflection.h,v
retrieving revision 1.54
diff -u -r1.54 reflection.h
--- mono/metadata/reflection.h 14 Aug 2002 15:40:31 -0000 1.54
+++ mono/metadata/reflection.h 25 Aug 2002 20:04:27 -0000
@@ -325,7 +325,7 @@
typedef struct {
MonoObject obj;
MonoImage *image;
- MonoObject *assembly;
+ MonoReflectionAssembly *assembly;
MonoString *fqname;
MonoString *name;
MonoString *scopename;
@@ -367,6 +367,16 @@
MonoString *codebase;
gint32 major, minor, build, revision;
/* FIXME: add missing stuff */
+/* CultureInfo cultureinfo;
+ AssemblyNameFlags flags;
+ AssemblyHashAlgorithm hashalg;
+ StrongNameKeyPair keypair;
+ AssemblyVersionCompatibility versioncompat;*/
+ MonoObject *cultureInfo;
+ MonoObject *flags;
+ MonoObject *hashalg;
+ MonoObject *keypair;
+ MonoObject *versioncompat;
} MonoReflectionAssemblyName;
typedef struct {
@@ -419,6 +429,8 @@
guint32 mono_image_create_token (MonoDynamicAssembly *assembly, MonoObject *obj);
MonoReflectionAssembly* mono_assembly_get_object (MonoDomain *domain, MonoAssembly *assembly);
+MonoReflectionAssemblyName* mono_assemblyname_get_object (MonoDomain *domain, MonoAssemblyName *assembly_name);
+MonoReflectionModule* mono_module_get_object (MonoDomain *domain, MonoImage *image);
MonoReflectionType* mono_type_get_object (MonoDomain *domain, MonoType *type);
MonoReflectionMethod* mono_method_get_object (MonoDomain *domain, MonoMethod *method, MonoClass *refclass);
MonoReflectionField* mono_field_get_object (MonoDomain *domain, MonoClass *klass, MonoClassField *field);
// created on 20.8.2002 at 21:13
using System;
using System.Reflection;
class TestiMain {
static int Main( string [] args )
{
System.Reflection.Assembly assembly;
System.Reflection.AssemblyName[] assemblyNames;
System.Reflection.Module[] modules;
assembly = System.Reflection.Assembly.GetEntryAssembly();
assemblyNames = assembly.GetReferencedAssemblies();
Console.WriteLine( "\nassemblyNames.Lenght = " + assemblyNames.Length
);
Console.WriteLine( "assemblyNames.GetLenght(0) = " +
assemblyNames.GetLength(0) );
Console.WriteLine( "assemblyNames.Rank = " + assemblyNames.Rank );
foreach (System.Reflection.AssemblyName assemblyName in assemblyNames)
{
Console.WriteLine( "GetReferencesAssemblies = "
+assemblyName.ToString() );
}
modules = assembly.GetModules();
Console.WriteLine( "\nmodules.Lenght = " + modules.Length );
Console.WriteLine( "modules.GetLenght(0) = " + modules.GetLength(0) );
Console.WriteLine( "modules.Rank = " + modules.Rank );
Console.WriteLine( "GetModules = " +modules.ToString() );
foreach (System.Reflection.Module module in modules) {
Console.WriteLine( module.ToString() );
}
return 0;
}
}