2 // Mono.ILASM.ExternTable.cs
5 // Jackson Harper (Jackson@LatitudeGeo.com)
7 // (C) 2003 Jackson Harper, All rights reserved
11 using System.Collections;
12 using System.Reflection;
14 namespace Mono.ILASM {
16 public class ExternTable {
18 protected class ExternAssembly {
20 public PEAPI.AssemblyRef AssemblyRef;
22 protected PEAPI.PEFile pefile;
23 protected Hashtable type_table;
25 public ExternAssembly (PEAPI.PEFile pefile, string name,
26 AssemblyName asmb_name)
28 type_table = new Hashtable ();
30 AssemblyRef = pefile.AddExternAssembly (name);
33 public PEAPI.ClassRef GetType (string name_space, string name)
35 string full_name = String.Format ("{0}.{1}",
37 PEAPI.ClassRef klass = type_table[full_name] as PEAPI.ClassRef;
42 klass = (PEAPI.ClassRef) AssemblyRef.AddClass (name_space, name);
43 type_table[full_name] = klass;
48 public PEAPI.ClassRef GetValueType (string name_space, string name)
50 string full_name = String.Format ("{0}.{1}",
52 PEAPI.ClassRef klass = type_table[full_name] as PEAPI.ClassRef;
57 klass = (PEAPI.ClassRef) AssemblyRef.AddValueClass (name_space, name);
58 type_table[full_name] = klass;
65 Hashtable assembly_table;
67 public ExternTable (PEAPI.PEFile pefile)
72 string mscorlib_name = "mscorlib";
73 AssemblyName mscorlib = new AssemblyName ();
74 mscorlib.Name = mscorlib_name;
75 AddAssembly (mscorlib_name, mscorlib);
77 // Also need to alias corlib, normally corlib and
78 // mscorlib are used interchangably
79 assembly_table["corlib"] = assembly_table["mscorlib"];
82 public void AddAssembly (string name, AssemblyName asmb_name)
84 if (assembly_table == null) {
85 assembly_table = new Hashtable ();
86 } else if (assembly_table.Contains (name)) {
87 // Maybe this is an error??
91 assembly_table[name] = new ExternAssembly (pefile, name, asmb_name);
94 public PEAPI.ClassRef GetClass (string asmb_name, string name_space, string name)
96 ExternAssembly ext_asmb;
97 ext_asmb = assembly_table[asmb_name] as ExternAssembly;
100 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
102 return ext_asmb.GetType (name_space, name);
105 public PEAPI.ClassRef GetClass (string asmb_name, string full_name)
107 ExternAssembly ext_asmb;
108 ext_asmb = assembly_table[asmb_name] as ExternAssembly;
110 if (ext_asmb == null)
111 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
113 string name_space, name;
115 GetNameAndNamespace (full_name, out name_space, out name);
117 return ext_asmb.GetType (name_space, name);
120 public PEAPI.ClassRef GetValueClass (string asmb_name, string full_name)
122 ExternAssembly ext_asmb;
123 ext_asmb = assembly_table[asmb_name] as ExternAssembly;
125 if (ext_asmb == null)
126 throw new Exception (String.Format ("Assembly {0} not defined.", asmb_name));
128 string name_space, name;
130 GetNameAndNamespace (full_name, out name_space, out name);
132 return ext_asmb.GetValueType (name_space, name);
135 public static void GetNameAndNamespace (string full_name,
136 out string name_space, out string name) {
138 int last_dot = full_name.LastIndexOf ('.');
141 name_space = String.Empty;
146 name_space = full_name.Substring (0, last_dot);
147 name = full_name.Substring (last_dot + 1);