~ubuntu-branches/ubuntu/oneiric/monodevelop/oneiric

« back to all changes in this revision

Viewing changes to contrib/Mono.Cecil/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs

  • Committer: Bazaar Package Importer
  • Author(s): Jo Shields
  • Date: 2011-06-27 17:03:13 UTC
  • mto: (1.8.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 54.
  • Revision ID: james.westby@ubuntu.com-20110627170313-6cvz3s19x6e9hqe9
ImportĀ upstreamĀ versionĀ 2.5.92+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
4
4
// Author:
5
5
//   Jb Evain (jbevain@gmail.com)
6
6
//
7
 
// (C) 2005 Jb Evain
 
7
// Copyright (c) 2008 - 2010 Jb Evain
8
8
//
9
9
// Permission is hereby granted, free of charge, to any person obtaining
10
10
// a copy of this software and associated documentation files (the
26
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
27
//
28
28
 
 
29
using System;
 
30
using System.Collections.Generic;
 
31
using System.IO;
 
32
using SR = System.Reflection;
 
33
 
 
34
using Mono.Cecil.Cil;
 
35
using Mono.Cecil.Metadata;
 
36
using Mono.Cecil.PE;
 
37
using Mono.Collections.Generic;
 
38
 
29
39
namespace Mono.Cecil {
30
40
 
31
 
        using System;
32
 
        using SR = System.Reflection;
33
 
        using SS = System.Security;
34
 
        using SSP = System.Security.Permissions;
35
 
        using System.Text;
36
 
 
37
 
        using Mono.Cecil.Cil;
38
 
        using Mono.Cecil.Binary;
39
 
        using Mono.Cecil.Metadata;
40
 
 
41
 
        public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider, IMetadataScope,
42
 
                IReflectionStructureVisitable, IReflectionVisitable {
43
 
 
44
 
                Guid m_mvid;
45
 
                bool m_main;
46
 
                bool m_manifestOnly;
47
 
 
48
 
                AssemblyNameReferenceCollection m_asmRefs;
49
 
                ModuleReferenceCollection m_modRefs;
50
 
                ResourceCollection m_res;
51
 
                TypeDefinitionCollection m_types;
52
 
                TypeReferenceCollection m_refs;
53
 
                ExternTypeCollection m_externs;
54
 
                MemberReferenceCollection m_members;
55
 
                CustomAttributeCollection m_customAttrs;
56
 
 
57
 
                AssemblyDefinition m_asm;
58
 
                Image m_image;
59
 
 
60
 
                ImageReader m_imgReader;
61
 
                ReflectionController m_controller;
62
 
                MetadataResolver m_resolver;
63
 
                SecurityDeclarationReader m_secReader;
 
41
        public enum ReadingMode {
 
42
                Immediate = 1,
 
43
                Deferred = 2,
 
44
        }
 
45
 
 
46
        public sealed class ReaderParameters {
 
47
 
 
48
                ReadingMode reading_mode;
 
49
                IAssemblyResolver assembly_resolver;
 
50
                Stream symbol_stream;
 
51
                ISymbolReaderProvider symbol_reader_provider;
 
52
                bool read_symbols;
 
53
 
 
54
                public ReadingMode ReadingMode {
 
55
                        get { return reading_mode; }
 
56
                        set { reading_mode = value; }
 
57
                }
 
58
 
 
59
                public IAssemblyResolver AssemblyResolver {
 
60
                        get { return assembly_resolver; }
 
61
                        set { assembly_resolver = value; }
 
62
                }
 
63
 
 
64
                public Stream SymbolStream {
 
65
                        get { return symbol_stream; }
 
66
                        set { symbol_stream = value; }
 
67
                }
 
68
 
 
69
                public ISymbolReaderProvider SymbolReaderProvider {
 
70
                        get { return symbol_reader_provider; }
 
71
                        set { symbol_reader_provider = value; }
 
72
                }
 
73
 
 
74
                public bool ReadSymbols {
 
75
                        get { return read_symbols; }
 
76
                        set { read_symbols = value; }
 
77
                }
 
78
 
 
79
                public ReaderParameters ()
 
80
                        : this (ReadingMode.Deferred)
 
81
                {
 
82
                }
 
83
 
 
84
                public ReaderParameters (ReadingMode readingMode)
 
85
                {
 
86
                        this.reading_mode = readingMode;
 
87
                }
 
88
        }
 
89
 
 
90
#if !READ_ONLY
 
91
 
 
92
        public sealed class ModuleParameters {
 
93
 
 
94
                ModuleKind kind;
 
95
                TargetRuntime runtime;
 
96
                TargetArchitecture architecture;
 
97
                IAssemblyResolver assembly_resolver;
 
98
 
 
99
                public ModuleKind Kind {
 
100
                        get { return kind; }
 
101
                        set { kind = value; }
 
102
                }
 
103
 
 
104
                public TargetRuntime Runtime {
 
105
                        get { return runtime; }
 
106
                        set { runtime = value; }
 
107
                }
 
108
 
 
109
                public TargetArchitecture Architecture {
 
110
                        get { return architecture; }
 
111
                        set { architecture = value; }
 
112
                }
 
113
 
 
114
                public IAssemblyResolver AssemblyResolver {
 
115
                        get { return assembly_resolver; }
 
116
                        set { assembly_resolver = value; }
 
117
                }
 
118
 
 
119
                public ModuleParameters ()
 
120
                {
 
121
                        this.kind = ModuleKind.Dll;
 
122
                        this.runtime = GetCurrentRuntime ();
 
123
                        this.architecture = TargetArchitecture.I386;
 
124
                }
 
125
 
 
126
                static TargetRuntime GetCurrentRuntime ()
 
127
                {
 
128
#if !CF
 
129
                        return typeof (object).Assembly.ImageRuntimeVersion.ParseRuntime ();
 
130
#else
 
131
                        var corlib_version = typeof (object).Assembly.GetName ().Version;
 
132
                        switch (corlib_version.Major) {
 
133
                        case 1:
 
134
                                return corlib_version.Minor == 0
 
135
                                        ? TargetRuntime.Net_1_0
 
136
                                        : TargetRuntime.Net_1_1;
 
137
                        case 2:
 
138
                                return TargetRuntime.Net_2_0;
 
139
                        case 4:
 
140
                                return TargetRuntime.Net_4_0;
 
141
                        default:
 
142
                                throw new NotSupportedException ();
 
143
                        }
 
144
#endif
 
145
                }
 
146
        }
 
147
 
 
148
        public sealed class WriterParameters {
 
149
 
 
150
                Stream symbol_stream;
 
151
                ISymbolWriterProvider symbol_writer_provider;
 
152
                bool write_symbols;
 
153
#if !SILVERLIGHT && !CF
 
154
                SR.StrongNameKeyPair key_pair;
 
155
#endif
 
156
                public Stream SymbolStream {
 
157
                        get { return symbol_stream; }
 
158
                        set { symbol_stream = value; }
 
159
                }
 
160
 
 
161
                public ISymbolWriterProvider SymbolWriterProvider {
 
162
                        get { return symbol_writer_provider; }
 
163
                        set { symbol_writer_provider = value; }
 
164
                }
 
165
 
 
166
                public bool WriteSymbols {
 
167
                        get { return write_symbols; }
 
168
                        set { write_symbols = value; }
 
169
                }
 
170
#if !SILVERLIGHT && !CF
 
171
                public SR.StrongNameKeyPair StrongNameKeyPair {
 
172
                        get { return key_pair; }
 
173
                        set { key_pair = value; }
 
174
                }
 
175
#endif
 
176
        }
 
177
 
 
178
#endif
 
179
 
 
180
        public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider {
 
181
 
 
182
                internal Image Image;
 
183
                internal MetadataSystem MetadataSystem;
 
184
                internal ReadingMode ReadingMode;
 
185
                internal ISymbolReaderProvider SymbolReaderProvider;
 
186
                internal ISymbolReader SymbolReader;
 
187
 
 
188
                internal IAssemblyResolver assembly_resolver;
 
189
                internal TypeSystem type_system;
 
190
 
 
191
                readonly MetadataReader reader;
 
192
                readonly string fq_name;
 
193
 
 
194
                internal ModuleKind kind;
 
195
                TargetRuntime runtime;
 
196
                TargetArchitecture architecture;
 
197
                ModuleAttributes attributes;
 
198
                Guid mvid;
 
199
 
 
200
                internal AssemblyDefinition assembly;
 
201
                MethodDefinition entry_point;
 
202
 
 
203
#if !READ_ONLY
 
204
                MetadataImporter importer;
 
205
#endif
 
206
                Collection<CustomAttribute> custom_attributes;
 
207
                Collection<AssemblyNameReference> references;
 
208
                Collection<ModuleReference> modules;
 
209
                Collection<Resource> resources;
 
210
                Collection<ExportedType> exported_types;
 
211
                TypeDefinitionCollection types;
 
212
 
 
213
                public bool IsMain {
 
214
                        get { return kind != ModuleKind.NetModule; }
 
215
                }
 
216
 
 
217
                public ModuleKind Kind {
 
218
                        get { return kind; }
 
219
                        set { kind = value; }
 
220
                }
 
221
 
 
222
                public TargetRuntime Runtime {
 
223
                        get { return runtime; }
 
224
                        set { runtime = value; }
 
225
                }
 
226
 
 
227
                public TargetArchitecture Architecture {
 
228
                        get { return architecture; }
 
229
                        set { architecture = value; }
 
230
                }
 
231
 
 
232
                public ModuleAttributes Attributes {
 
233
                        get { return attributes; }
 
234
                        set { attributes = value; }
 
235
                }
 
236
 
 
237
                public string FullyQualifiedName {
 
238
                        get { return fq_name; }
 
239
                }
64
240
 
65
241
                public Guid Mvid {
66
 
                        get { return m_mvid; }
67
 
                        set { m_mvid = value; }
68
 
                }
69
 
 
70
 
                public bool Main {
71
 
                        get { return m_main; }
72
 
                        set { m_main = value; }
73
 
                }
74
 
 
75
 
                public AssemblyNameReferenceCollection AssemblyReferences {
76
 
                        get { return m_asmRefs; }
77
 
                }
78
 
 
79
 
                public ModuleReferenceCollection ModuleReferences {
80
 
                        get { return m_modRefs; }
81
 
                }
82
 
 
83
 
                public ResourceCollection Resources {
84
 
                        get { return m_res; }
85
 
                }
86
 
 
87
 
                public TypeDefinitionCollection Types {
88
 
                        get { return m_types; }
89
 
                }
90
 
 
91
 
                public TypeReferenceCollection TypeReferences {
92
 
                        get { return m_refs; }
93
 
                }
94
 
 
95
 
                public MemberReferenceCollection MemberReferences {
96
 
                        get { return m_members; }
97
 
                }
98
 
 
99
 
                public ExternTypeCollection ExternTypes {
100
 
                        get {
101
 
                                if (m_externs == null)
102
 
                                        m_externs = new ExternTypeCollection (this);
103
 
 
104
 
                                return m_externs;
 
242
                        get { return mvid; }
 
243
                        set { mvid = value; }
 
244
                }
 
245
 
 
246
                internal bool HasImage {
 
247
                        get { return Image != null; }
 
248
                }
 
249
 
 
250
                public bool HasSymbols {
 
251
                        get { return SymbolReader != null; }
 
252
                }
 
253
 
 
254
                public override MetadataScopeType MetadataScopeType {
 
255
                        get { return MetadataScopeType.ModuleDefinition; }
 
256
                }
 
257
 
 
258
                public AssemblyDefinition Assembly {
 
259
                        get { return assembly; }
 
260
                }
 
261
 
 
262
#if !READ_ONLY
 
263
                internal MetadataImporter MetadataImporter {
 
264
                        get { return importer ?? (importer = new MetadataImporter (this)); }
 
265
                }
 
266
#endif
 
267
 
 
268
                public IAssemblyResolver AssemblyResolver {
 
269
                        get { return assembly_resolver; }
 
270
                }
 
271
 
 
272
                public TypeSystem TypeSystem {
 
273
                        get { return type_system ?? (type_system = TypeSystem.CreateTypeSystem (this)); }
 
274
                }
 
275
 
 
276
                public bool HasAssemblyReferences {
 
277
                        get {
 
278
                                if (references != null)
 
279
                                        return references.Count > 0;
 
280
 
 
281
                                return HasImage && Image.HasTable (Table.AssemblyRef);
 
282
                        }
 
283
                }
 
284
 
 
285
                public Collection<AssemblyNameReference> AssemblyReferences {
 
286
                        get {
 
287
                                if (references != null)
 
288
                                        return references;
 
289
 
 
290
                                if (HasImage)
 
291
                                        return references = Read (this, (_, reader) => reader.ReadAssemblyReferences ());
 
292
 
 
293
                                return references = new Collection<AssemblyNameReference> ();
 
294
                        }
 
295
                }
 
296
 
 
297
                public bool HasModuleReferences {
 
298
                        get {
 
299
                                if (modules != null)
 
300
                                        return modules.Count > 0;
 
301
 
 
302
                                return HasImage && Image.HasTable (Table.ModuleRef);
 
303
                        }
 
304
                }
 
305
 
 
306
                public Collection<ModuleReference> ModuleReferences {
 
307
                        get {
 
308
                                if (modules != null)
 
309
                                        return modules;
 
310
 
 
311
                                if (HasImage)
 
312
                                        return modules = Read (this, (_, reader) => reader.ReadModuleReferences ());
 
313
 
 
314
                                return modules = new Collection<ModuleReference> ();
 
315
                        }
 
316
                }
 
317
 
 
318
                public bool HasResources {
 
319
                        get {
 
320
                                if (resources != null)
 
321
                                        return resources.Count > 0;
 
322
 
 
323
                                if (HasImage)
 
324
                                        return Image.HasTable (Table.ManifestResource) || Read (this, (_, reader) => reader.HasFileResource ());
 
325
 
 
326
                                return false;
 
327
                        }
 
328
                }
 
329
 
 
330
                public Collection<Resource> Resources {
 
331
                        get {
 
332
                                if (resources != null)
 
333
                                        return resources;
 
334
 
 
335
                                if (HasImage)
 
336
                                        return resources = Read (this, (_, reader) => reader.ReadResources ());
 
337
 
 
338
                                return resources = new Collection<Resource> ();
105
339
                        }
106
340
                }
107
341
 
108
342
                public bool HasCustomAttributes {
109
 
                        get { return (m_customAttrs == null) ? false : (m_customAttrs.Count > 0); }
110
 
                }
111
 
 
112
 
                public CustomAttributeCollection CustomAttributes {
113
 
                        get {
114
 
                                if (m_customAttrs == null)
115
 
                                        m_customAttrs = new CustomAttributeCollection (this);
116
 
 
117
 
                                return m_customAttrs;
118
 
                        }
119
 
                }
120
 
 
121
 
                public AssemblyDefinition Assembly {
122
 
                        get { return m_asm; }
123
 
                }
124
 
 
125
 
                internal ReflectionController Controller {
126
 
                        get { return m_controller; }
127
 
                }
128
 
 
129
 
                internal MetadataResolver Resolver {
130
 
                        get { return m_resolver; }
131
 
                }
132
 
 
133
 
                internal ImageReader ImageReader {
134
 
                        get { return m_imgReader; }
135
 
                }
136
 
 
137
 
                public Image Image {
138
 
                        get { return m_image; }
139
 
                        set {
140
 
                                m_image = value;
141
 
                                m_secReader = null;
142
 
                        }
143
 
                }
144
 
 
145
 
                public ModuleDefinition (string name, AssemblyDefinition asm) :
146
 
                        this (name, asm, null, false)
147
 
                {
148
 
                }
149
 
 
150
 
                public ModuleDefinition (string name, AssemblyDefinition asm, bool main) :
151
 
                        this (name, asm, null, main)
152
 
                {
153
 
                }
154
 
 
155
 
                internal ModuleDefinition (string name, AssemblyDefinition asm, StructureReader reader, bool main) : base (name)
156
 
                {
157
 
                        if (asm == null)
158
 
                                throw new ArgumentNullException ("asm");
159
 
                        if (name == null || name.Length == 0)
160
 
                                throw new ArgumentNullException ("name");
161
 
 
162
 
                        m_asm = asm;
163
 
                        m_main = main;
164
 
#if !CF_1_0
165
 
                        m_mvid = Guid.NewGuid ();
166
 
#endif
167
 
                        if (reader != null) {
168
 
                                m_image = reader.Image;
169
 
                                m_imgReader = reader.ImageReader;
170
 
                                m_manifestOnly = reader.ManifestOnly;
171
 
                        } else
172
 
                                m_image = Image.CreateImage ();
173
 
 
174
 
                        m_modRefs = new ModuleReferenceCollection (this);
175
 
                        m_asmRefs = new AssemblyNameReferenceCollection (this);
176
 
                        m_res = new ResourceCollection (this);
177
 
                        m_types = new TypeDefinitionCollection (this);
178
 
                        m_refs = new TypeReferenceCollection (this);
179
 
                        m_members = new MemberReferenceCollection (this);
180
 
 
181
 
                        m_controller = new ReflectionController (this);
182
 
                        m_resolver = new MetadataResolver (asm);
183
 
                }
184
 
 
185
 
                public IMetadataTokenProvider LookupByToken (MetadataToken token)
186
 
                {
187
 
                        return m_controller.Reader.LookupByToken (token);
188
 
                }
189
 
 
190
 
                public IMetadataTokenProvider LookupByToken (TokenType table, int rid)
191
 
                {
192
 
                        return LookupByToken (new MetadataToken (table, (uint) rid));
193
 
                }
194
 
 
195
 
                void CheckContext (TypeDefinition context)
196
 
                {
197
 
                        if (context.Module != this)
198
 
                                throw new ArgumentException ("The context parameter does not belongs to this module");
199
 
 
200
 
                        CheckGenericParameterProvider (context);
201
 
                }
202
 
 
203
 
                void CheckContext (MethodDefinition context)
204
 
                {
205
 
                        CheckGenericParameterProvider (context);
206
 
                }
207
 
 
208
 
                static void CheckGenericParameterProvider (IGenericParameterProvider context)
 
343
                        get {
 
344
                                if (custom_attributes != null)
 
345
                                        return custom_attributes.Count > 0;
 
346
 
 
347
                                return this.GetHasCustomAttributes (this);
 
348
                        }
 
349
                }
 
350
 
 
351
                public Collection<CustomAttribute> CustomAttributes {
 
352
                        get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (this)); }
 
353
                }
 
354
 
 
355
                public bool HasTypes {
 
356
                        get {
 
357
                                if (types != null)
 
358
                                        return types.Count > 0;
 
359
 
 
360
                                return HasImage && Image.HasTable (Table.TypeDef);
 
361
                        }
 
362
                }
 
363
 
 
364
                public Collection<TypeDefinition> Types {
 
365
                        get {
 
366
                                if (types != null)
 
367
                                        return types;
 
368
 
 
369
                                if (HasImage)
 
370
                                        return types = Read (this, (_, reader) => reader.ReadTypes ());
 
371
 
 
372
                                return types = new TypeDefinitionCollection (this);
 
373
                        }
 
374
                }
 
375
 
 
376
                public bool HasExportedTypes {
 
377
                        get {
 
378
                                if (exported_types != null)
 
379
                                        return exported_types.Count > 0;
 
380
 
 
381
                                return HasImage && Image.HasTable (Table.ExportedType);
 
382
                        }
 
383
                }
 
384
 
 
385
                public Collection<ExportedType> ExportedTypes {
 
386
                        get {
 
387
                                if (exported_types != null)
 
388
                                        return exported_types;
 
389
 
 
390
                                if (HasImage)
 
391
                                        return exported_types = Read (this, (_, reader) => reader.ReadExportedTypes ());
 
392
 
 
393
                                return exported_types = new Collection<ExportedType> ();
 
394
                        }
 
395
                }
 
396
 
 
397
                public MethodDefinition EntryPoint {
 
398
                        get {
 
399
                                if (entry_point != null)
 
400
                                        return entry_point;
 
401
 
 
402
                                if (HasImage)
 
403
                                        return entry_point = Read (this, (_, reader) => reader.ReadEntryPoint ());
 
404
 
 
405
                                return entry_point = null;
 
406
                        }
 
407
                        set { entry_point = value; }
 
408
                }
 
409
 
 
410
                internal ModuleDefinition ()
 
411
                {
 
412
                        this.MetadataSystem = new MetadataSystem ();
 
413
                        this.token = new MetadataToken (TokenType.Module, 1);
 
414
                        this.assembly_resolver = GlobalAssemblyResolver.Instance;
 
415
                }
 
416
 
 
417
                internal ModuleDefinition (Image image)
 
418
                        : this ()
 
419
                {
 
420
                        this.Image = image;
 
421
                        this.kind = image.Kind;
 
422
                        this.runtime = image.Runtime;
 
423
                        this.architecture = image.Architecture;
 
424
                        this.attributes = image.Attributes;
 
425
                        this.fq_name = image.FileName;
 
426
 
 
427
                        this.reader = new MetadataReader (this);
 
428
                }
 
429
 
 
430
                public bool HasTypeReference (string fullName)
 
431
                {
 
432
                        return HasTypeReference (string.Empty, fullName);
 
433
                }
 
434
 
 
435
                public bool HasTypeReference (string scope, string fullName)
 
436
                {
 
437
                        CheckFullName (fullName);
 
438
 
 
439
                        if (!HasImage)
 
440
                                return false;
 
441
 
 
442
                        return Read (this, (_, reader) => reader.GetTypeReference (scope, fullName) != null);
 
443
                }
 
444
 
 
445
                public bool TryGetTypeReference (string fullName, out TypeReference type)
 
446
                {
 
447
                        return TryGetTypeReference (string.Empty, fullName, out type);
 
448
                }
 
449
 
 
450
                public bool TryGetTypeReference (string scope, string fullName, out TypeReference type)
 
451
                {
 
452
                        CheckFullName (fullName);
 
453
 
 
454
                        if (!HasImage) {
 
455
                                type = null;
 
456
                                return false;
 
457
                        }
 
458
 
 
459
                        return (type = Read (this, (_, reader) => reader.GetTypeReference (scope, fullName))) != null;
 
460
                }
 
461
 
 
462
                public IEnumerable<TypeReference> GetTypeReferences ()
 
463
                {
 
464
                        if (!HasImage)
 
465
                                return Empty<TypeReference>.Array;
 
466
 
 
467
                        return Read (this, (_, reader) => reader.GetTypeReferences ());
 
468
                }
 
469
 
 
470
                public IEnumerable<MemberReference> GetMemberReferences ()
 
471
                {
 
472
                        if (!HasImage)
 
473
                                return Empty<MemberReference>.Array;
 
474
 
 
475
                        return Read (this, (_, reader) => reader.GetMemberReferences ());
 
476
                }
 
477
 
 
478
                public TypeDefinition GetType (string fullName)
 
479
                {
 
480
                        CheckFullName (fullName);
 
481
 
 
482
                        var position = fullName.IndexOf ('/');
 
483
                        if (position > 0)
 
484
                                return GetNestedType (fullName);
 
485
 
 
486
                        return ((TypeDefinitionCollection) this.Types).GetType (fullName);
 
487
                }
 
488
 
 
489
                public TypeDefinition GetType (string @namespace, string name)
 
490
                {
 
491
                        Mixin.CheckName (name);
 
492
 
 
493
                        return ((TypeDefinitionCollection) this.Types).GetType (@namespace ?? string.Empty, name);
 
494
                }
 
495
 
 
496
                static void CheckFullName (string fullName)
 
497
                {
 
498
                        if (fullName == null)
 
499
                                throw new ArgumentNullException ("fullName");
 
500
                        if (fullName.Length == 0)
 
501
                                throw new ArgumentException ();
 
502
                }
 
503
 
 
504
                TypeDefinition GetNestedType (string fullname)
 
505
                {
 
506
                        var names = fullname.Split ('/');
 
507
                        var type = GetType (names [0]);
 
508
 
 
509
                        if (type == null)
 
510
                                return null;
 
511
 
 
512
                        for (int i = 1; i < names.Length; i++) {
 
513
                                var nested_type = type.GetNestedType (names [i]);
 
514
                                if (nested_type == null)
 
515
                                        return null;
 
516
 
 
517
                                type = nested_type;
 
518
                        }
 
519
 
 
520
                        return type;
 
521
                }
 
522
 
 
523
                internal FieldDefinition Resolve (FieldReference field)
 
524
                {
 
525
                        return MetadataResolver.Resolve (AssemblyResolver, field);
 
526
                }
 
527
 
 
528
                internal MethodDefinition Resolve (MethodReference method)
 
529
                {
 
530
                        return MetadataResolver.Resolve (AssemblyResolver, method);
 
531
                }
 
532
 
 
533
                internal TypeDefinition Resolve (TypeReference type)
 
534
                {
 
535
                        return MetadataResolver.Resolve (AssemblyResolver, type);
 
536
                }
 
537
 
 
538
#if !READ_ONLY
 
539
 
 
540
                static void CheckType (object type)
 
541
                {
 
542
                        if (type == null)
 
543
                                throw new ArgumentNullException ("type");
 
544
                }
 
545
 
 
546
                static void CheckField (object field)
 
547
                {
 
548
                        if (field == null)
 
549
                                throw new ArgumentNullException ("field");
 
550
                }
 
551
 
 
552
                static void CheckMethod (object method)
 
553
                {
 
554
                        if (method == null)
 
555
                                throw new ArgumentNullException ("method");
 
556
                }
 
557
 
 
558
                static void CheckContext (IGenericParameterProvider context, ModuleDefinition module)
209
559
                {
210
560
                        if (context == null)
211
 
                                throw new ArgumentNullException ("context");
212
 
                        if (context.GenericParameters.Count == 0)
213
 
                                throw new ArgumentException ("The context parameter is not a generic type");
214
 
                }
215
 
 
216
 
                ImportContext GetContext ()
217
 
                {
218
 
                        return new ImportContext (m_controller.Importer);
219
 
                }
220
 
 
221
 
                static ImportContext GetContext (IImporter importer)
222
 
                {
223
 
                        return new ImportContext (importer);
224
 
                }
225
 
 
226
 
                ImportContext GetContext (TypeDefinition context)
227
 
                {
228
 
                        return new ImportContext (m_controller.Importer, context);
229
 
                }
230
 
 
231
 
                ImportContext GetContext (MethodDefinition context)
232
 
                {
233
 
                        return new ImportContext (m_controller.Importer, context);
234
 
                }
235
 
 
236
 
                static ImportContext GetContext (IImporter importer, TypeDefinition context)
237
 
                {
238
 
                        return new ImportContext (importer, context);
239
 
                }
240
 
 
 
561
                                return;
 
562
 
 
563
                        if (context.Module != module)
 
564
                                throw new ArgumentException ();
 
565
                }
 
566
 
 
567
#if !CF
241
568
                public TypeReference Import (Type type)
242
569
                {
243
 
                        if (type == null)
244
 
                                throw new ArgumentNullException ("type");
245
 
 
246
 
                        return m_controller.Helper.ImportSystemType (type, GetContext ());
247
 
                }
248
 
 
249
 
                public TypeReference Import (Type type, TypeDefinition context)
250
 
                {
251
 
                        if (type == null)
252
 
                                throw new ArgumentNullException ("type");
253
 
                        CheckContext (context);
254
 
 
255
 
                        return m_controller.Helper.ImportSystemType (type, GetContext (context));
256
 
                }
257
 
 
258
 
                public TypeReference Import (Type type, MethodDefinition context)
259
 
                {
260
 
                        if (type == null)
261
 
                                throw new ArgumentNullException ("type");
262
 
                        CheckContext (context);
263
 
 
264
 
                        return m_controller.Helper.ImportSystemType (type, GetContext (context));
265
 
                }
266
 
 
267
 
                public MethodReference Import (SR.MethodBase meth)
268
 
                {
269
 
                        if (meth == null)
270
 
                                throw new ArgumentNullException ("meth");
271
 
 
272
 
                        if (meth is SR.ConstructorInfo)
273
 
                                return m_controller.Helper.ImportConstructorInfo (
274
 
                                        meth as SR.ConstructorInfo, GetContext ());
275
 
                        else
276
 
                                return m_controller.Helper.ImportMethodInfo (
277
 
                                        meth as SR.MethodInfo, GetContext ());
278
 
                }
279
 
 
280
 
                public MethodReference Import (SR.MethodBase meth, TypeDefinition context)
281
 
                {
282
 
                        if (meth == null)
283
 
                                throw new ArgumentNullException ("meth");
284
 
                        CheckContext (context);
285
 
 
286
 
                        ImportContext import_context = GetContext (context);
287
 
 
288
 
                        if (meth is SR.ConstructorInfo)
289
 
                                return m_controller.Helper.ImportConstructorInfo (
290
 
                                        meth as SR.ConstructorInfo, import_context);
291
 
                        else
292
 
                                return m_controller.Helper.ImportMethodInfo (
293
 
                                        meth as SR.MethodInfo, import_context);
 
570
                        CheckType (type);
 
571
 
 
572
                        return MetadataImporter.ImportType (type, null, ImportGenericKind.Definition);
 
573
                }
 
574
 
 
575
                public TypeReference Import (Type type, TypeReference context)
 
576
                {
 
577
                        return Import (type, (IGenericParameterProvider) context);
 
578
                }
 
579
 
 
580
                public TypeReference Import (Type type, MethodReference context)
 
581
                {
 
582
                        return Import (type, (IGenericParameterProvider) context);
 
583
                }
 
584
 
 
585
                TypeReference Import (Type type, IGenericParameterProvider context)
 
586
                {
 
587
                        CheckType (type);
 
588
                        CheckContext (context, this);
 
589
 
 
590
                        return MetadataImporter.ImportType (
 
591
                                type,
 
592
                                (IGenericContext) context,
 
593
                                context != null
 
594
                                        ? ImportGenericKind.Open
 
595
                                        : ImportGenericKind.Definition);
294
596
                }
295
597
 
296
598
                public FieldReference Import (SR.FieldInfo field)
297
599
                {
298
 
                        if (field == null)
299
 
                                throw new ArgumentNullException ("field");
300
 
 
301
 
                        return m_controller.Helper.ImportFieldInfo (field, GetContext ());
302
 
                }
303
 
 
304
 
                public FieldReference Import (SR.FieldInfo field, TypeDefinition context)
305
 
                {
306
 
                        if (field == null)
307
 
                                throw new ArgumentNullException ("field");
308
 
                        CheckContext (context);
309
 
 
310
 
                        return m_controller.Helper.ImportFieldInfo (field, GetContext (context));
311
 
                }
312
 
 
313
 
                public FieldReference Import (SR.FieldInfo field, MethodDefinition context)
314
 
                {
315
 
                        if (field == null)
316
 
                                throw new ArgumentNullException ("field");
317
 
                        CheckContext (context);
318
 
 
319
 
                        return m_controller.Helper.ImportFieldInfo (field, GetContext (context));
320
 
                }
 
600
                        CheckField (field);
 
601
 
 
602
                        return MetadataImporter.ImportField (field, null);
 
603
                }
 
604
 
 
605
                public FieldReference Import (SR.FieldInfo field, TypeReference context)
 
606
                {
 
607
                        return Import (field, (IGenericParameterProvider) context);
 
608
                }
 
609
 
 
610
                public FieldReference Import (SR.FieldInfo field, MethodReference context)
 
611
                {
 
612
                        return Import (field, (IGenericParameterProvider) context);
 
613
                }
 
614
 
 
615
                FieldReference Import (SR.FieldInfo field, IGenericParameterProvider context)
 
616
                {
 
617
                        CheckField (field);
 
618
                        CheckContext (context, this);
 
619
 
 
620
                        return MetadataImporter.ImportField (field, (IGenericContext) context);
 
621
                }
 
622
 
 
623
                public MethodReference Import (SR.MethodBase method)
 
624
                {
 
625
                        CheckMethod (method);
 
626
 
 
627
                        return MetadataImporter.ImportMethod (method, null, ImportGenericKind.Definition);
 
628
                }
 
629
 
 
630
                public MethodReference Import (SR.MethodBase method, TypeReference context)
 
631
                {
 
632
                        return Import (method, (IGenericParameterProvider) context);
 
633
                }
 
634
 
 
635
                public MethodReference Import (SR.MethodBase method, MethodReference context)
 
636
                {
 
637
                        return Import (method, (IGenericParameterProvider) context);
 
638
                }
 
639
 
 
640
                MethodReference Import (SR.MethodBase method, IGenericParameterProvider context)
 
641
                {
 
642
                        CheckMethod (method);
 
643
                        CheckContext (context, this);
 
644
 
 
645
                        return MetadataImporter.ImportMethod (method,
 
646
                                (IGenericContext) context,
 
647
                                context != null
 
648
                                        ? ImportGenericKind.Open
 
649
                                        : ImportGenericKind.Definition);
 
650
                }
 
651
#endif
321
652
 
322
653
                public TypeReference Import (TypeReference type)
323
654
                {
324
 
                        if (type == null)
325
 
                                throw new ArgumentNullException ("type");
326
 
 
327
 
                        return m_controller.Importer.ImportTypeReference (type, GetContext ());
328
 
                }
329
 
 
330
 
                public TypeReference Import (TypeReference type, TypeDefinition context)
331
 
                {
332
 
                        if (type == null)
333
 
                                throw new ArgumentNullException ("type");
334
 
                        CheckContext (context);
335
 
 
336
 
                        return m_controller.Importer.ImportTypeReference (type, GetContext (context));
337
 
                }
338
 
 
339
 
                public TypeReference Import (TypeReference type, MethodDefinition context)
340
 
                {
341
 
                        if (type == null)
342
 
                                throw new ArgumentNullException ("type");
343
 
                        CheckContext (context);
344
 
 
345
 
                        return m_controller.Importer.ImportTypeReference (type, GetContext (context));
346
 
                }
347
 
 
348
 
                public MethodReference Import (MethodReference meth)
349
 
                {
350
 
                        if (meth == null)
351
 
                                throw new ArgumentNullException ("meth");
352
 
 
353
 
                        return m_controller.Importer.ImportMethodReference (meth, GetContext ());
354
 
                }
355
 
 
356
 
                public MethodReference Import (MethodReference meth, TypeDefinition context)
357
 
                {
358
 
                        if (meth == null)
359
 
                                throw new ArgumentNullException ("meth");
360
 
                        CheckContext (context);
361
 
 
362
 
                        return m_controller.Importer.ImportMethodReference (meth, GetContext (context));
363
 
                }
364
 
 
365
 
                public MethodReference Import (MethodReference meth, MethodDefinition context)
366
 
                {
367
 
                        if (meth == null)
368
 
                                throw new ArgumentNullException ("meth");
369
 
                        CheckContext (context);
370
 
 
371
 
                        return m_controller.Importer.ImportMethodReference (meth, GetContext (context));
 
655
                        CheckType (type);
 
656
 
 
657
                        if (type.Module == this)
 
658
                                return type;
 
659
 
 
660
                        return MetadataImporter.ImportType (type, null);
 
661
                }
 
662
 
 
663
                public TypeReference Import (TypeReference type, TypeReference context)
 
664
                {
 
665
                        return Import (type, (IGenericParameterProvider) context);
 
666
                }
 
667
 
 
668
                public TypeReference Import (TypeReference type, MethodReference context)
 
669
                {
 
670
                        return Import (type, (IGenericParameterProvider) context);
 
671
                }
 
672
 
 
673
                TypeReference Import (TypeReference type, IGenericParameterProvider context)
 
674
                {
 
675
                        CheckType (type);
 
676
 
 
677
                        if (type.Module == this)
 
678
                                return type;
 
679
 
 
680
                        CheckContext (context, this);
 
681
 
 
682
                        return MetadataImporter.ImportType (type, (IGenericContext) context);
372
683
                }
373
684
 
374
685
                public FieldReference Import (FieldReference field)
375
686
                {
376
 
                        if (field == null)
377
 
                                throw new ArgumentNullException ("field");
378
 
 
379
 
                        return m_controller.Importer.ImportFieldReference (field, GetContext ());
380
 
                }
381
 
 
382
 
                public FieldReference Import (FieldReference field, TypeDefinition context)
383
 
                {
384
 
                        if (field == null)
385
 
                                throw new ArgumentNullException ("field");
386
 
                        CheckContext (context);
387
 
 
388
 
                        return m_controller.Importer.ImportFieldReference (field, GetContext (context));
389
 
                }
390
 
 
391
 
                public FieldReference Import (FieldReference field, MethodDefinition context)
392
 
                {
393
 
                        if (field == null)
394
 
                                throw new ArgumentNullException ("field");
395
 
                        CheckContext (context);
396
 
 
397
 
                        return m_controller.Importer.ImportFieldReference (field, GetContext (context));
398
 
                }
399
 
 
400
 
                static FieldDefinition ImportFieldDefinition (FieldDefinition field, ImportContext context)
401
 
                {
402
 
                        return FieldDefinition.Clone (field, context);
403
 
                }
404
 
 
405
 
                static MethodDefinition ImportMethodDefinition (MethodDefinition meth, ImportContext context)
406
 
                {
407
 
                        return MethodDefinition.Clone (meth, context);
408
 
                }
409
 
 
410
 
                static TypeDefinition ImportTypeDefinition (TypeDefinition type, ImportContext context)
411
 
                {
412
 
                        return TypeDefinition.Clone (type, context);
413
 
                }
414
 
 
415
 
                public TypeDefinition Inject (TypeDefinition type)
416
 
                {
417
 
                        return Inject (type, m_controller.Importer);
418
 
                }
419
 
 
420
 
                public TypeDefinition Inject (TypeDefinition type, IImporter importer)
421
 
                {
422
 
                        if (type == null)
423
 
                                throw new ArgumentNullException ("type");
424
 
                        if (importer == null)
425
 
                                throw new ArgumentNullException ("importer");
426
 
 
427
 
                        TypeDefinition definition = ImportTypeDefinition (type, GetContext (importer));
428
 
                        this.Types.Add (definition);
429
 
                        return definition;
430
 
                }
431
 
 
432
 
                public TypeDefinition Inject (TypeDefinition type, TypeDefinition context)
433
 
                {
434
 
                        return Inject (type, context, m_controller.Importer);
435
 
                }
436
 
 
437
 
                public TypeDefinition Inject (TypeDefinition type, TypeDefinition context, IImporter importer)
438
 
                {
439
 
                        Check (type, context, importer);
440
 
 
441
 
                        TypeDefinition definition = ImportTypeDefinition (type, GetContext (importer, context));
442
 
                        context.NestedTypes.Add (definition);
443
 
                        return definition;
444
 
                }
445
 
 
446
 
                public MethodDefinition Inject (MethodDefinition meth, TypeDefinition context)
447
 
                {
448
 
                        return Inject (meth, context, m_controller.Importer);
449
 
                }
450
 
 
451
 
                void Check (IMemberDefinition definition, TypeDefinition context, IImporter importer)
452
 
                {
453
 
                        if (definition == null)
454
 
                                throw new ArgumentNullException ("definition");
455
 
                        if (context == null)
456
 
                                throw new ArgumentNullException ("context");
457
 
                        if (importer == null)
458
 
                                throw new ArgumentNullException ("importer");
459
 
                        if (context.Module != this)
460
 
                                throw new ArgumentException ("The context parameter does not belongs to this module");
461
 
                }
462
 
 
463
 
                public MethodDefinition Inject (MethodDefinition meth, TypeDefinition context, IImporter importer)
464
 
                {
465
 
                        Check (meth, context, importer);
466
 
 
467
 
                        MethodDefinition definition = ImportMethodDefinition (meth, GetContext (importer, context));
468
 
                        context.Methods.Add (definition);
469
 
                        return definition;
470
 
                }
471
 
 
472
 
                public FieldDefinition Inject (FieldDefinition field, TypeDefinition context)
473
 
                {
474
 
                        return Inject (field, context, m_controller.Importer);
475
 
                }
476
 
 
477
 
                public FieldDefinition Inject (FieldDefinition field, TypeDefinition context, IImporter importer)
478
 
                {
479
 
                        Check (field, context, importer);
480
 
 
481
 
                        FieldDefinition definition = ImportFieldDefinition (field, GetContext (importer, context));
482
 
                        context.Fields.Add (definition);
483
 
                        return definition;
484
 
                }
485
 
 
486
 
                public void FullLoad ()
487
 
                {
488
 
                        if (m_manifestOnly)
489
 
                                m_controller.Reader.VisitModuleDefinition (this);
490
 
 
491
 
                        foreach (TypeDefinition type in this.Types) {
492
 
                                foreach (MethodDefinition meth in type.Methods)
493
 
                                        meth.LoadBody ();
494
 
                                foreach (MethodDefinition ctor in type.Constructors)
495
 
                                        ctor.LoadBody ();
496
 
                        }
497
 
 
498
 
                        if (m_controller.Reader.SymbolReader == null)
 
687
                        CheckField (field);
 
688
 
 
689
                        if (field.Module == this)
 
690
                                return field;
 
691
 
 
692
                        return MetadataImporter.ImportField (field, null);
 
693
                }
 
694
 
 
695
                public FieldReference Import (FieldReference field, TypeReference context)
 
696
                {
 
697
                        return Import (field, (IGenericParameterProvider) context);
 
698
                }
 
699
 
 
700
                public FieldReference Import (FieldReference field, MethodReference context)
 
701
                {
 
702
                        return Import (field, (IGenericParameterProvider) context);
 
703
                }
 
704
 
 
705
                FieldReference Import (FieldReference field, IGenericParameterProvider context)
 
706
                {
 
707
                        CheckField (field);
 
708
 
 
709
                        if (field.Module == this)
 
710
                                return field;
 
711
 
 
712
                        CheckContext (context, this);
 
713
 
 
714
                        return MetadataImporter.ImportField (field, (IGenericContext) context);
 
715
                }
 
716
 
 
717
                public MethodReference Import (MethodReference method)
 
718
                {
 
719
                        CheckMethod (method);
 
720
 
 
721
                        if (method.Module == this)
 
722
                                return method;
 
723
 
 
724
                        return MetadataImporter.ImportMethod (method, null);
 
725
                }
 
726
 
 
727
                public MethodReference Import (MethodReference method, TypeReference context)
 
728
                {
 
729
                        return Import (method, (IGenericParameterProvider) context);
 
730
                }
 
731
 
 
732
                public MethodReference Import (MethodReference method, MethodReference context)
 
733
                {
 
734
                        return Import (method, (IGenericParameterProvider) context);
 
735
                }
 
736
 
 
737
                MethodReference Import (MethodReference method, IGenericParameterProvider context)
 
738
                {
 
739
                        CheckMethod (method);
 
740
 
 
741
                        if (method.Module == this)
 
742
                                return method;
 
743
 
 
744
                        CheckContext (context, this);
 
745
 
 
746
                        return MetadataImporter.ImportMethod (method, (IGenericContext) context);
 
747
                }
 
748
 
 
749
#endif
 
750
 
 
751
                public IMetadataTokenProvider LookupToken (int token)
 
752
                {
 
753
                        return LookupToken (new MetadataToken ((uint) token));
 
754
                }
 
755
 
 
756
                public IMetadataTokenProvider LookupToken (MetadataToken token)
 
757
                {
 
758
                        return Read (this, (_, reader) => reader.LookupToken (token));
 
759
                }
 
760
 
 
761
                internal TRet Read<TItem, TRet> (TItem item, Func<TItem, MetadataReader, TRet> read)
 
762
                {
 
763
                        var position = reader.position;
 
764
                        var context = reader.context;
 
765
 
 
766
                        var ret = read (item, reader);
 
767
 
 
768
                        reader.position = position;
 
769
                        reader.context = context;
 
770
 
 
771
                        return ret;
 
772
                }
 
773
 
 
774
                void ProcessDebugHeader ()
 
775
                {
 
776
                        if (Image == null || Image.Debug.IsZero)
499
777
                                return;
500
778
 
501
 
                        m_controller.Reader.SymbolReader.Dispose ();
502
 
                        m_controller.Reader.SymbolReader = null;
503
 
                }
504
 
 
505
 
                public void LoadSymbols ()
506
 
                {
507
 
                        m_controller.Reader.SymbolReader = SymbolStoreHelper.GetReader (this);
508
 
                }
509
 
 
510
 
                public void LoadSymbols (ISymbolReader reader)
511
 
                {
512
 
                        m_controller.Reader.SymbolReader = reader;
513
 
                }
514
 
 
515
 
                public void SaveSymbols ()
516
 
                {
517
 
                        m_controller.Writer.SaveSymbols = true;
518
 
                }
519
 
 
520
 
                public void SaveSymbols (ISymbolWriter writer)
521
 
                {
522
 
                        SaveSymbols ();
523
 
                        m_controller.Writer.SymbolWriter = writer;
524
 
                }
525
 
 
526
 
                public void SaveSymbols (string outputDirectory)
527
 
                {
528
 
                        SaveSymbols ();
529
 
                        m_controller.Writer.OutputFile = outputDirectory;
530
 
                }
531
 
 
532
 
                public void SaveSymbols (string outputDirectory, ISymbolWriter writer)
533
 
                {
534
 
                        SaveSymbols (outputDirectory);
535
 
                        m_controller.Writer.SymbolWriter = writer;
536
 
                }
537
 
 
538
 
                public byte [] GetAsByteArray (CustomAttribute ca)
539
 
                {
540
 
                        CustomAttribute customAttr = ca;
541
 
                        if (!ca.Resolved)
542
 
                                if (customAttr.Blob != null)
543
 
                                        return customAttr.Blob;
544
 
                                else
545
 
                                        return new byte [0];
546
 
 
547
 
                        return m_controller.Writer.SignatureWriter.CompressCustomAttribute (
548
 
                                ReflectionWriter.GetCustomAttributeSig (ca), ca.Constructor);
549
 
                }
550
 
 
551
 
                public byte [] GetAsByteArray (SecurityDeclaration dec)
552
 
                {
553
 
                        // TODO - add support for 2.0 format
554
 
                        // note: the 1.x format is still supported in 2.0 so this isn't an immediate problem
555
 
                        if (!dec.Resolved)
556
 
                                return dec.Blob;
557
 
 
558
 
#if !CF_1_0 && !CF_2_0
559
 
                        if (dec.PermissionSet != null)
560
 
                                return Encoding.Unicode.GetBytes (dec.PermissionSet.ToXml ().ToString ());
561
 
#endif
562
 
 
563
 
                        return new byte [0];
564
 
                }
565
 
 
566
 
                public CustomAttribute FromByteArray (MethodReference ctor, byte [] data)
567
 
                {
568
 
                        return m_controller.Reader.GetCustomAttribute (ctor, data);
569
 
                }
570
 
 
571
 
                public SecurityDeclaration FromByteArray (SecurityAction action, byte [] declaration)
572
 
                {
573
 
                        if (m_secReader == null)
574
 
                                m_secReader = new SecurityDeclarationReader (Image.MetadataRoot, m_controller.Reader);
575
 
                        return m_secReader.FromByteArray (action, declaration);
576
 
                }
577
 
 
578
 
                public override void Accept (IReflectionStructureVisitor visitor)
579
 
                {
580
 
                        visitor.VisitModuleDefinition (this);
581
 
 
582
 
                        this.AssemblyReferences.Accept (visitor);
583
 
                        this.ModuleReferences.Accept (visitor);
584
 
                        this.Resources.Accept (visitor);
585
 
                }
586
 
 
587
 
                public void Accept (IReflectionVisitor visitor)
588
 
                {
589
 
                        visitor.VisitModuleDefinition (this);
590
 
 
591
 
                        this.Types.Accept (visitor);
592
 
                        this.TypeReferences.Accept (visitor);
593
 
                }
594
 
 
595
 
                public override string ToString ()
596
 
                {
597
 
                        string s = (m_main ? "(main), Mvid=" : "Mvid=");
598
 
                        return s + m_mvid;
 
779
                        byte [] header;
 
780
                        var directory = Image.GetDebugHeader (out header);
 
781
 
 
782
                        if (!SymbolReader.ProcessDebugHeader (directory, header))
 
783
                                throw new InvalidOperationException ();
 
784
                }
 
785
 
 
786
#if !READ_ONLY
 
787
 
 
788
                public static ModuleDefinition CreateModule (string name, ModuleKind kind)
 
789
                {
 
790
                        return CreateModule (name, new ModuleParameters { Kind = kind });
 
791
                }
 
792
 
 
793
                public static ModuleDefinition CreateModule (string name, ModuleParameters parameters)
 
794
                {
 
795
                        Mixin.CheckName (name);
 
796
                        Mixin.CheckParameters (parameters);
 
797
 
 
798
                        var module = new ModuleDefinition {
 
799
                                Name = name,
 
800
                                kind = parameters.Kind,
 
801
                                runtime = parameters.Runtime,
 
802
                                architecture = parameters.Architecture,
 
803
                                mvid = Guid.NewGuid (),
 
804
                                Attributes = ModuleAttributes.ILOnly,
 
805
                        };
 
806
 
 
807
                        if (parameters.AssemblyResolver != null)
 
808
                                module.assembly_resolver = parameters.AssemblyResolver;
 
809
 
 
810
                        if (parameters.Kind != ModuleKind.NetModule) {
 
811
                                var assembly = new AssemblyDefinition ();
 
812
                                module.assembly = assembly;
 
813
                                module.assembly.Name = new AssemblyNameDefinition (name, new Version (0, 0));
 
814
                                assembly.main_module = module;
 
815
                        }
 
816
 
 
817
                        module.Types.Add (new TypeDefinition (string.Empty, "<Module>", TypeAttributes.NotPublic));
 
818
 
 
819
                        return module;
 
820
                }
 
821
 
 
822
#endif
 
823
 
 
824
                public void ReadSymbols ()
 
825
                {
 
826
                        if (string.IsNullOrEmpty (fq_name))
 
827
                                throw new InvalidOperationException ();
 
828
 
 
829
                        var provider = SymbolProvider.GetPlatformReaderProvider ();
 
830
 
 
831
                        SymbolReader = provider.GetSymbolReader (this, fq_name);
 
832
 
 
833
                        ProcessDebugHeader ();
 
834
                }
 
835
 
 
836
                public void ReadSymbols (ISymbolReader reader)
 
837
                {
 
838
                        if (reader == null)
 
839
                                throw new ArgumentNullException ("reader");
 
840
 
 
841
                        SymbolReader = reader;
 
842
 
 
843
                        ProcessDebugHeader ();
 
844
                }
 
845
 
 
846
                public static ModuleDefinition ReadModule (string fileName)
 
847
                {
 
848
                        return ReadModule (fileName, new ReaderParameters (ReadingMode.Deferred));
 
849
                }
 
850
 
 
851
                public static ModuleDefinition ReadModule (Stream stream)
 
852
                {
 
853
                        return ReadModule (stream, new ReaderParameters (ReadingMode.Deferred));
 
854
                }
 
855
 
 
856
                public static ModuleDefinition ReadModule (string fileName, ReaderParameters parameters)
 
857
                {
 
858
                        using (var stream = GetFileStream (fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) {
 
859
                                return ReadModule (stream, parameters);
 
860
                        }
 
861
                }
 
862
 
 
863
                static void CheckStream (object stream)
 
864
                {
 
865
                        if (stream == null)
 
866
                                throw new ArgumentNullException ("stream");
 
867
                }
 
868
 
 
869
                public static ModuleDefinition ReadModule (Stream stream, ReaderParameters parameters)
 
870
                {
 
871
                        CheckStream (stream);
 
872
                        if (!stream.CanRead || !stream.CanSeek)
 
873
                                throw new ArgumentException ();
 
874
                        Mixin.CheckParameters (parameters);
 
875
 
 
876
                        return ModuleReader.CreateModuleFrom (
 
877
                                ImageReader.ReadImageFrom (stream),
 
878
                                parameters);
 
879
                }
 
880
 
 
881
                static Stream GetFileStream (string fileName, FileMode mode, FileAccess access, FileShare share)
 
882
                {
 
883
                        if (fileName == null)
 
884
                                throw new ArgumentNullException ("fileName");
 
885
                        if (fileName.Length == 0)
 
886
                                throw new ArgumentException ();
 
887
 
 
888
                        return new FileStream (fileName, mode, access, share);
 
889
                }
 
890
 
 
891
#if !READ_ONLY
 
892
 
 
893
                public void Write (string fileName)
 
894
                {
 
895
                        Write (fileName, new WriterParameters ());
 
896
                }
 
897
 
 
898
                public void Write (Stream stream)
 
899
                {
 
900
                        Write (stream, new WriterParameters ());
 
901
                }
 
902
 
 
903
                public void Write (string fileName, WriterParameters parameters)
 
904
                {
 
905
                        using (var stream = GetFileStream (fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) {
 
906
                                Write (stream, parameters);
 
907
                        }
 
908
                }
 
909
 
 
910
                public void Write (Stream stream, WriterParameters parameters)
 
911
                {
 
912
                        CheckStream (stream);
 
913
                        if (!stream.CanWrite || !stream.CanSeek)
 
914
                                throw new ArgumentException ();
 
915
                        Mixin.CheckParameters (parameters);
 
916
 
 
917
                        ModuleWriter.WriteModuleTo (this, stream, parameters);
 
918
                }
 
919
 
 
920
#endif
 
921
 
 
922
        }
 
923
 
 
924
        static partial class Mixin {
 
925
 
 
926
                public static void CheckParameters (object parameters)
 
927
                {
 
928
                        if (parameters == null)
 
929
                                throw new ArgumentNullException ("parameters");
 
930
                }
 
931
 
 
932
                public static bool HasImage (this ModuleDefinition self)
 
933
                {
 
934
                        return self != null && self.HasImage;
 
935
                }
 
936
 
 
937
                public static string GetFullyQualifiedName (this Stream self)
 
938
                {
 
939
#if !SILVERLIGHT
 
940
                        var file_stream = self as FileStream;
 
941
                        if (file_stream == null)
 
942
                                return string.Empty;
 
943
 
 
944
                        return Path.GetFullPath (file_stream.Name);
 
945
#else
 
946
                        return string.Empty;
 
947
#endif
 
948
                }
 
949
 
 
950
                public static TargetRuntime ParseRuntime (this string self)
 
951
                {
 
952
                        switch (self [1]) {
 
953
                        case '1':
 
954
                                return self [3] == '0'
 
955
                                        ? TargetRuntime.Net_1_0
 
956
                                        : TargetRuntime.Net_1_1;
 
957
                        case '2':
 
958
                                return TargetRuntime.Net_2_0;
 
959
                        case '4':
 
960
                        default:
 
961
                                return TargetRuntime.Net_4_0;
 
962
                        }
599
963
                }
600
964
        }
601
965
}