Merge pull request #1542 from ninjarobot/UriTemplateMatchException
[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 using System.Runtime.Serialization;
38
39 namespace System.Reflection {
40
41         abstract class RuntimeAssembly : Assembly
42         {
43                 public override void GetObjectData (SerializationInfo info, StreamingContext context)
44                 {
45                         if (info == null)
46                                 throw new ArgumentNullException ("info");
47
48                         UnitySerializationHolder.GetUnitySerializationInfo (info,
49                                                                UnitySerializationHolder.AssemblyUnity,
50                                                                this.FullName,
51                                                                this);
52                 }
53         }
54
55         [ComVisible (true)]
56         [ComDefaultInterfaceAttribute (typeof (_Assembly))]
57         [Serializable]
58         [ClassInterface(ClassInterfaceType.None)]
59         class MonoAssembly : RuntimeAssembly
60         {
61                 public
62                 override
63                 Type GetType (string name, bool throwOnError, bool ignoreCase)
64                 {
65                         Type res;
66                         if (name == null)
67                                 throw new ArgumentNullException (name);
68                         if (name.Length == 0)
69                         throw new ArgumentException ("name", "Name cannot be empty");
70
71                         res = InternalGetType (null, name, throwOnError, ignoreCase);
72                         return res;
73                 }
74
75                 public
76                 override
77                 Module GetModule (String name)
78                 {
79                         if (name == null)
80                                 throw new ArgumentNullException ("name");
81                         if (name.Length == 0)
82                                 throw new ArgumentException ("Name can't be empty");
83
84                         Module[] modules = GetModules (true);
85                         foreach (Module module in modules) {
86                                 if (module.ScopeName == name)
87                                         return module;
88                         }
89
90                         return null;
91                 }
92
93                 public
94                 override
95                 AssemblyName[] GetReferencedAssemblies () {
96                         return GetReferencedAssemblies (this);
97                 }
98
99                 public
100                 override
101                 Module[] GetModules (bool getResourceModules) {
102                         Module[] modules = GetModulesInternal ();
103
104                         if (!getResourceModules) {
105                                 var result = new List<Module> (modules.Length);
106                                 foreach (Module m in modules)
107                                         if (!m.IsResource ())
108                                                 result.Add (m);
109                                 return result.ToArray ();
110                         }
111                         else
112                                 return modules;
113                 }
114
115                 [MonoTODO ("Always returns the same as GetModules")]
116                 public
117                 override
118                 Module[] GetLoadedModules (bool getResourceModules)
119                 {
120                         return GetModules (getResourceModules);
121                 }
122
123                 public
124                 override
125                 Assembly GetSatelliteAssembly (CultureInfo culture)
126                 {
127                         return GetSatelliteAssembly (culture, null, true);
128                 }
129
130                 public
131                 override
132                 Assembly GetSatelliteAssembly (CultureInfo culture, Version version)
133                 {
134                         return GetSatelliteAssembly (culture, version, true);
135                 }
136
137                 //FIXME remove GetManifestModule under v4, it's a v2 artifact
138                 [ComVisible (false)]
139                 public
140                 override
141                 Module ManifestModule {
142                         get {
143                                 return GetManifestModule ();
144                         }
145                 }
146
147                 public
148                 override
149                 bool GlobalAssemblyCache {
150                         get {
151                                 return get_global_assembly_cache ();
152                         }
153                 }
154         }
155 }
156
157