b861da70e00c7ec541394c814b7e50dc310ef39a
[mono.git] / mcs / class / corlib / System.Reflection / MonoAssembly.cs
1 //
2 // System.Reflection/MonoAssembly.cs
3 //
4 // Author:
5 //   Rodrigo Kumpera (rkumpera@novell.com)
6 //
7 // Copyright (C) 2010 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.Collections;
31 using System.Globalization;
32 using System.Runtime.InteropServices;
33 #if !FULL_AOT_RUNTIME
34 using System.Reflection.Emit;
35 #endif
36 using System.Collections.Generic;
37
38 namespace System.Reflection {
39
40 #if NET_4_0 || MOONLIGHT || MOBILE
41         [ComVisible (true)]
42         [ComDefaultInterfaceAttribute (typeof (_Assembly))]
43         [Serializable]
44         [ClassInterface(ClassInterfaceType.None)]
45         class MonoAssembly : Assembly {
46 #else
47         public partial class Assembly {
48 #endif
49                 public
50 #if NET_4_0 || MOONLIGHT || MOBILE
51                 override
52 #endif
53                 Type GetType (string name, bool throwOnError, bool ignoreCase)
54                 {
55                         Type res;
56                         if (name == null)
57                                 throw new ArgumentNullException (name);
58                         if (name.Length == 0)
59                         throw new ArgumentException ("name", "Name cannot be empty");
60
61                         res = InternalGetType (null, name, throwOnError, ignoreCase);
62 #if !(NET_4_0 || MOONLIGHT || MOBILE) && !FULL_AOT_RUNTIME
63                         if (res is TypeBuilder) {
64                                 if (throwOnError)
65                                         throw new TypeLoadException (string.Format ("Could not load type '{0}' from assembly '{1}'", name, this));
66                                 return null;
67                         }
68 #endif
69                         return res;
70                 }
71
72                 public
73 #if NET_4_0 || MOONLIGHT || MOBILE
74                 override
75 #endif
76                 Module GetModule (String name)
77                 {
78                         if (name == null)
79                                 throw new ArgumentNullException ("name");
80                         if (name.Length == 0)
81                                 throw new ArgumentException ("Name can't be empty");
82
83                         Module[] modules = GetModules (true);
84                         foreach (Module module in modules) {
85                                 if (module.ScopeName == name)
86                                         return module;
87                         }
88
89                         return null;
90                 }
91
92                 public
93 #if NET_4_0 || MOONLIGHT || MOBILE
94                 override
95 #endif
96                 AssemblyName[] GetReferencedAssemblies () {
97                         return GetReferencedAssemblies (this);
98                 }
99
100                 public
101 #if NET_4_0 || MOONLIGHT || MOBILE
102                 override
103 #endif
104                 Module[] GetModules (bool getResourceModules) {
105                         Module[] modules = GetModulesInternal ();
106
107                         if (!getResourceModules) {
108                                 var result = new List<Module> (modules.Length);
109                                 foreach (Module m in modules)
110                                         if (!m.IsResource ())
111                                                 result.Add (m);
112                                 return result.ToArray ();
113                         }
114                         else
115                                 return modules;
116                 }
117
118                 [MonoTODO ("Always returns the same as GetModules")]
119                 public
120 #if NET_4_0 || MOONLIGHT || MOBILE
121                 override
122 #endif
123                 Module[] GetLoadedModules (bool getResourceModules)
124                 {
125                         return GetModules (getResourceModules);
126                 }
127
128                 public
129 #if NET_4_0 || MOONLIGHT || MOBILE
130                 override
131 #endif
132                 Assembly GetSatelliteAssembly (CultureInfo culture)
133                 {
134                         return GetSatelliteAssembly (culture, null, true);
135                 }
136
137                 public
138 #if NET_4_0 || MOONLIGHT || MOBILE
139                 override
140 #endif
141                 Assembly GetSatelliteAssembly (CultureInfo culture, Version version)
142                 {
143                         return GetSatelliteAssembly (culture, version, true);
144                 }
145
146                 //FIXME remove GetManifestModule under v4, it's a v2 artifact
147                 [ComVisible (false)]
148                 public
149 #if NET_4_0 || MOONLIGHT || MOBILE
150                 override
151 #endif
152                 Module ManifestModule {
153                         get {
154                                 return GetManifestModule ();
155                         }
156                 }
157
158 #if !MOONLIGHT
159                 public
160 #if NET_4_0
161                 override
162 #endif
163                 bool GlobalAssemblyCache {
164                         get {
165                                 return get_global_assembly_cache ();
166                         }
167                 }
168 #endif
169
170         }
171 }
172
173