forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			1354 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1354 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
//
 | 
						|
// Author:
 | 
						|
//   Jb Evain (jbevain@gmail.com)
 | 
						|
//
 | 
						|
// Copyright (c) 2008 - 2015 Jb Evain
 | 
						|
// Copyright (c) 2008 - 2011 Novell, Inc.
 | 
						|
//
 | 
						|
// Licensed under the MIT/X11 license.
 | 
						|
//
 | 
						|
 | 
						|
using MonoFN.Cecil.Cil;
 | 
						|
using MonoFN.Cecil.Metadata;
 | 
						|
using MonoFN.Cecil.PE;
 | 
						|
using MonoFN.Collections.Generic;
 | 
						|
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.IO;
 | 
						|
using System.Threading;
 | 
						|
using SR = System.Reflection;
 | 
						|
 | 
						|
namespace MonoFN.Cecil {
 | 
						|
 | 
						|
	public enum ReadingMode {
 | 
						|
		Immediate = 1,
 | 
						|
		Deferred = 2,
 | 
						|
	}
 | 
						|
 | 
						|
	public sealed class ReaderParameters {
 | 
						|
 | 
						|
		ReadingMode reading_mode;
 | 
						|
		internal IAssemblyResolver assembly_resolver;
 | 
						|
		internal IMetadataResolver metadata_resolver;
 | 
						|
		internal IMetadataImporterProvider metadata_importer_provider;
 | 
						|
		internal IReflectionImporterProvider reflection_importer_provider;
 | 
						|
		Stream symbol_stream;
 | 
						|
		ISymbolReaderProvider symbol_reader_provider;
 | 
						|
		bool read_symbols;
 | 
						|
		bool throw_symbols_mismatch;
 | 
						|
		bool projections;
 | 
						|
		bool in_memory;
 | 
						|
		bool read_write;
 | 
						|
 | 
						|
		public ReadingMode ReadingMode {
 | 
						|
			get { return reading_mode; }
 | 
						|
			set { reading_mode = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool InMemory {
 | 
						|
			get { return in_memory; }
 | 
						|
			set { in_memory = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IAssemblyResolver AssemblyResolver {
 | 
						|
			get { return assembly_resolver; }
 | 
						|
			set { assembly_resolver = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataResolver MetadataResolver {
 | 
						|
			get { return metadata_resolver; }
 | 
						|
			set { metadata_resolver = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataImporterProvider MetadataImporterProvider {
 | 
						|
			get { return metadata_importer_provider; }
 | 
						|
			set { metadata_importer_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IReflectionImporterProvider ReflectionImporterProvider {
 | 
						|
			get { return reflection_importer_provider; }
 | 
						|
			set { reflection_importer_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public Stream SymbolStream {
 | 
						|
			get { return symbol_stream; }
 | 
						|
			set { symbol_stream = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ISymbolReaderProvider SymbolReaderProvider {
 | 
						|
			get { return symbol_reader_provider; }
 | 
						|
			set { symbol_reader_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool ReadSymbols {
 | 
						|
			get { return read_symbols; }
 | 
						|
			set { read_symbols = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool ThrowIfSymbolsAreNotMatching {
 | 
						|
			get { return throw_symbols_mismatch; }
 | 
						|
			set { throw_symbols_mismatch = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool ReadWrite {
 | 
						|
			get { return read_write; }
 | 
						|
			set { read_write = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool ApplyWindowsRuntimeProjections {
 | 
						|
			get { return projections; }
 | 
						|
			set { projections = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ReaderParameters ()
 | 
						|
			: this (ReadingMode.Deferred)
 | 
						|
		{
 | 
						|
		}
 | 
						|
 | 
						|
		public ReaderParameters (ReadingMode readingMode)
 | 
						|
		{
 | 
						|
			this.reading_mode = readingMode;
 | 
						|
			this.throw_symbols_mismatch = true;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public sealed class ModuleParameters {
 | 
						|
 | 
						|
		ModuleKind kind;
 | 
						|
		TargetRuntime runtime;
 | 
						|
		uint? timestamp;
 | 
						|
		TargetArchitecture architecture;
 | 
						|
		IAssemblyResolver assembly_resolver;
 | 
						|
		IMetadataResolver metadata_resolver;
 | 
						|
		IMetadataImporterProvider metadata_importer_provider;
 | 
						|
		IReflectionImporterProvider reflection_importer_provider;
 | 
						|
 | 
						|
		public ModuleKind Kind {
 | 
						|
			get { return kind; }
 | 
						|
			set { kind = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public TargetRuntime Runtime {
 | 
						|
			get { return runtime; }
 | 
						|
			set { runtime = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public uint? Timestamp {
 | 
						|
			get { return timestamp; }
 | 
						|
			set { timestamp = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public TargetArchitecture Architecture {
 | 
						|
			get { return architecture; }
 | 
						|
			set { architecture = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IAssemblyResolver AssemblyResolver {
 | 
						|
			get { return assembly_resolver; }
 | 
						|
			set { assembly_resolver = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataResolver MetadataResolver {
 | 
						|
			get { return metadata_resolver; }
 | 
						|
			set { metadata_resolver = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataImporterProvider MetadataImporterProvider {
 | 
						|
			get { return metadata_importer_provider; }
 | 
						|
			set { metadata_importer_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public IReflectionImporterProvider ReflectionImporterProvider {
 | 
						|
			get { return reflection_importer_provider; }
 | 
						|
			set { reflection_importer_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ModuleParameters ()
 | 
						|
		{
 | 
						|
			this.kind = ModuleKind.Dll;
 | 
						|
			this.Runtime = GetCurrentRuntime ();
 | 
						|
			this.architecture = TargetArchitecture.I386;
 | 
						|
		}
 | 
						|
 | 
						|
		static TargetRuntime GetCurrentRuntime ()
 | 
						|
		{
 | 
						|
			return typeof (object).Assembly.ImageRuntimeVersion.ParseRuntime ();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	public sealed class WriterParameters {
 | 
						|
 | 
						|
		uint? timestamp;
 | 
						|
		Stream symbol_stream;
 | 
						|
		ISymbolWriterProvider symbol_writer_provider;
 | 
						|
		bool write_symbols;
 | 
						|
		byte [] key_blob;
 | 
						|
		string key_container;
 | 
						|
		SR.StrongNameKeyPair key_pair;
 | 
						|
 | 
						|
		public uint? Timestamp {
 | 
						|
			get { return timestamp; }
 | 
						|
			set { timestamp = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public Stream SymbolStream {
 | 
						|
			get { return symbol_stream; }
 | 
						|
			set { symbol_stream = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ISymbolWriterProvider SymbolWriterProvider {
 | 
						|
			get { return symbol_writer_provider; }
 | 
						|
			set { symbol_writer_provider = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool WriteSymbols {
 | 
						|
			get { return write_symbols; }
 | 
						|
			set { write_symbols = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasStrongNameKey {
 | 
						|
			get { return key_pair != null || key_blob != null || key_container != null; }
 | 
						|
		}
 | 
						|
 | 
						|
		public byte [] StrongNameKeyBlob {
 | 
						|
			get { return key_blob; }
 | 
						|
			set { key_blob = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public string StrongNameKeyContainer {
 | 
						|
			get { return key_container; }
 | 
						|
			set { key_container = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public SR.StrongNameKeyPair StrongNameKeyPair {
 | 
						|
			get { return key_pair; }
 | 
						|
			set { key_pair = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool DeterministicMvid { get; set; }
 | 
						|
	}
 | 
						|
 | 
						|
	public sealed class ModuleDefinition : ModuleReference, ICustomAttributeProvider, ICustomDebugInformationProvider, IDisposable {
 | 
						|
 | 
						|
		internal Image Image;
 | 
						|
		internal MetadataSystem MetadataSystem;
 | 
						|
		internal ReadingMode ReadingMode;
 | 
						|
		internal ISymbolReaderProvider SymbolReaderProvider;
 | 
						|
 | 
						|
		internal ISymbolReader symbol_reader;
 | 
						|
		internal Disposable<IAssemblyResolver> assembly_resolver;
 | 
						|
		internal IMetadataResolver metadata_resolver;
 | 
						|
		internal TypeSystem type_system;
 | 
						|
		internal readonly MetadataReader reader;
 | 
						|
		readonly string file_name;
 | 
						|
 | 
						|
		internal string runtime_version;
 | 
						|
		internal ModuleKind kind;
 | 
						|
		WindowsRuntimeProjections projections;
 | 
						|
		MetadataKind metadata_kind;
 | 
						|
		TargetRuntime runtime;
 | 
						|
		TargetArchitecture architecture;
 | 
						|
		ModuleAttributes attributes;
 | 
						|
		ModuleCharacteristics characteristics;
 | 
						|
		Guid mvid;
 | 
						|
 | 
						|
		internal ushort linker_version = 8;
 | 
						|
		internal ushort subsystem_major = 4;
 | 
						|
		internal ushort subsystem_minor = 0;
 | 
						|
		internal uint timestamp;
 | 
						|
 | 
						|
		internal AssemblyDefinition assembly;
 | 
						|
		MethodDefinition entry_point;
 | 
						|
		bool entry_point_set;
 | 
						|
 | 
						|
		internal IReflectionImporter reflection_importer;
 | 
						|
		internal IMetadataImporter metadata_importer;
 | 
						|
 | 
						|
		Collection<CustomAttribute> custom_attributes;
 | 
						|
		Collection<AssemblyNameReference> references;
 | 
						|
		Collection<ModuleReference> modules;
 | 
						|
		Collection<Resource> resources;
 | 
						|
		Collection<ExportedType> exported_types;
 | 
						|
		TypeDefinitionCollection types;
 | 
						|
 | 
						|
		internal Collection<CustomDebugInformation> custom_infos;
 | 
						|
 | 
						|
		internal MetadataBuilder metadata_builder;
 | 
						|
 | 
						|
		public bool IsMain {
 | 
						|
			get { return kind != ModuleKind.NetModule; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ModuleKind Kind {
 | 
						|
			get { return kind; }
 | 
						|
			set { kind = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public MetadataKind MetadataKind {
 | 
						|
			get { return metadata_kind; }
 | 
						|
			set { metadata_kind = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		internal WindowsRuntimeProjections Projections {
 | 
						|
			get {
 | 
						|
				if (projections == null)
 | 
						|
					Interlocked.CompareExchange (ref projections, new WindowsRuntimeProjections (this), null);
 | 
						|
 | 
						|
				return projections;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public TargetRuntime Runtime {
 | 
						|
			get { return runtime; }
 | 
						|
			set {
 | 
						|
				runtime = value;
 | 
						|
				runtime_version = runtime.RuntimeVersionString ();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public string RuntimeVersion {
 | 
						|
			get { return runtime_version; }
 | 
						|
			set {
 | 
						|
				runtime_version = value;
 | 
						|
				runtime = runtime_version.ParseRuntime ();
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public TargetArchitecture Architecture {
 | 
						|
			get { return architecture; }
 | 
						|
			set { architecture = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ModuleAttributes Attributes {
 | 
						|
			get { return attributes; }
 | 
						|
			set { attributes = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ModuleCharacteristics Characteristics {
 | 
						|
			get { return characteristics; }
 | 
						|
			set { characteristics = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use FileName")]
 | 
						|
		public string FullyQualifiedName {
 | 
						|
			get { return file_name; }
 | 
						|
		}
 | 
						|
 | 
						|
		public string FileName {
 | 
						|
			get { return file_name; }
 | 
						|
		}
 | 
						|
 | 
						|
		public Guid Mvid {
 | 
						|
			get { return mvid; }
 | 
						|
			set { mvid = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		internal bool HasImage {
 | 
						|
			get { return Image != null; }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasSymbols {
 | 
						|
			get { return symbol_reader != null; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ISymbolReader SymbolReader {
 | 
						|
			get { return symbol_reader; }
 | 
						|
		}
 | 
						|
 | 
						|
		public override MetadataScopeType MetadataScopeType {
 | 
						|
			get { return MetadataScopeType.ModuleDefinition; }
 | 
						|
		}
 | 
						|
 | 
						|
		public AssemblyDefinition Assembly {
 | 
						|
			get { return assembly; }
 | 
						|
		}
 | 
						|
 | 
						|
		internal IReflectionImporter ReflectionImporter {
 | 
						|
			get {
 | 
						|
				if (reflection_importer == null)
 | 
						|
					Interlocked.CompareExchange (ref reflection_importer, new DefaultReflectionImporter (this), null);
 | 
						|
 | 
						|
				return reflection_importer;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		internal IMetadataImporter MetadataImporter {
 | 
						|
			get {
 | 
						|
				if (metadata_importer == null)
 | 
						|
					Interlocked.CompareExchange (ref metadata_importer, new DefaultMetadataImporter (this), null);
 | 
						|
 | 
						|
				return metadata_importer;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public IAssemblyResolver AssemblyResolver {
 | 
						|
			get {
 | 
						|
				if (assembly_resolver.value == null) {
 | 
						|
					lock (module_lock) {
 | 
						|
						assembly_resolver = Disposable.Owned (new DefaultAssemblyResolver () as IAssemblyResolver);
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				return assembly_resolver.value;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataResolver MetadataResolver {
 | 
						|
			get {
 | 
						|
				if (metadata_resolver == null)
 | 
						|
					Interlocked.CompareExchange (ref metadata_resolver, new MetadataResolver (this.AssemblyResolver), null);
 | 
						|
 | 
						|
				return metadata_resolver;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeSystem TypeSystem {
 | 
						|
			get {
 | 
						|
				if (type_system == null)
 | 
						|
					Interlocked.CompareExchange (ref type_system, TypeSystem.CreateTypeSystem (this), null);
 | 
						|
 | 
						|
				return type_system;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasAssemblyReferences {
 | 
						|
			get {
 | 
						|
				if (references != null)
 | 
						|
					return references.Count > 0;
 | 
						|
 | 
						|
				return HasImage && Image.HasTable (Table.AssemblyRef);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<AssemblyNameReference> AssemblyReferences {
 | 
						|
			get {
 | 
						|
				if (references != null)
 | 
						|
					return references;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Read (ref references, this, (_, reader) => reader.ReadAssemblyReferences ());
 | 
						|
 | 
						|
				Interlocked.CompareExchange (ref references, new Collection<AssemblyNameReference> (), null);
 | 
						|
				return references;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasModuleReferences {
 | 
						|
			get {
 | 
						|
				if (modules != null)
 | 
						|
					return modules.Count > 0;
 | 
						|
 | 
						|
				return HasImage && Image.HasTable (Table.ModuleRef);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<ModuleReference> ModuleReferences {
 | 
						|
			get {
 | 
						|
				if (modules != null)
 | 
						|
					return modules;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Read (ref modules, this, (_, reader) => reader.ReadModuleReferences ());
 | 
						|
 | 
						|
				Interlocked.CompareExchange (ref modules, new Collection<ModuleReference> (), null);
 | 
						|
				return modules;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasResources {
 | 
						|
			get {
 | 
						|
				if (resources != null)
 | 
						|
					return resources.Count > 0;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Image.HasTable (Table.ManifestResource) || Read (this, (_, reader) => reader.HasFileResource ());
 | 
						|
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<Resource> Resources {
 | 
						|
			get {
 | 
						|
				if (resources != null)
 | 
						|
					return resources;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Read (ref resources, this, (_, reader) => reader.ReadResources ());
 | 
						|
 | 
						|
				Interlocked.CompareExchange (ref resources, new Collection<Resource> (), null);
 | 
						|
				return resources;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasCustomAttributes {
 | 
						|
			get {
 | 
						|
				if (custom_attributes != null)
 | 
						|
					return custom_attributes.Count > 0;
 | 
						|
 | 
						|
				return this.GetHasCustomAttributes (this);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<CustomAttribute> CustomAttributes {
 | 
						|
			get { return custom_attributes ?? (this.GetCustomAttributes (ref custom_attributes, this)); }
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasTypes {
 | 
						|
			get {
 | 
						|
				if (types != null)
 | 
						|
					return types.Count > 0;
 | 
						|
 | 
						|
				return HasImage && Image.HasTable (Table.TypeDef);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<TypeDefinition> Types {
 | 
						|
			get {
 | 
						|
				if (types != null)
 | 
						|
					return types;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Read (ref types, this, (_, reader) => reader.ReadTypes ());
 | 
						|
 | 
						|
				Interlocked.CompareExchange (ref types, new TypeDefinitionCollection (this), null);
 | 
						|
				return types;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasExportedTypes {
 | 
						|
			get {
 | 
						|
				if (exported_types != null)
 | 
						|
					return exported_types.Count > 0;
 | 
						|
 | 
						|
				return HasImage && Image.HasTable (Table.ExportedType);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<ExportedType> ExportedTypes {
 | 
						|
			get {
 | 
						|
				if (exported_types != null)
 | 
						|
					return exported_types;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					return Read (ref exported_types, this, (_, reader) => reader.ReadExportedTypes ());
 | 
						|
 | 
						|
				Interlocked.CompareExchange (ref exported_types, new Collection<ExportedType> (), null);
 | 
						|
				return exported_types;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public MethodDefinition EntryPoint {
 | 
						|
			get {
 | 
						|
				if (entry_point_set)
 | 
						|
					return entry_point;
 | 
						|
 | 
						|
				if (HasImage)
 | 
						|
					Read (ref entry_point, this, (_, reader) => reader.ReadEntryPoint ());
 | 
						|
				else
 | 
						|
					entry_point = null;
 | 
						|
 | 
						|
				entry_point_set = true;
 | 
						|
				return entry_point;
 | 
						|
			}
 | 
						|
			set {
 | 
						|
				entry_point = value;
 | 
						|
				entry_point_set = true;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasCustomDebugInformations {
 | 
						|
			get {
 | 
						|
				return custom_infos != null && custom_infos.Count > 0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public Collection<CustomDebugInformation> CustomDebugInformations {
 | 
						|
			get {
 | 
						|
				if (custom_infos == null)
 | 
						|
					Interlocked.CompareExchange (ref custom_infos, new Collection<CustomDebugInformation> (), null);
 | 
						|
 | 
						|
				return custom_infos;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		internal ModuleDefinition ()
 | 
						|
		{
 | 
						|
			this.MetadataSystem = new MetadataSystem ();
 | 
						|
			this.token = new MetadataToken (TokenType.Module, 1);
 | 
						|
		}
 | 
						|
 | 
						|
		internal ModuleDefinition (Image image)
 | 
						|
			: this ()
 | 
						|
		{
 | 
						|
			this.Image = image;
 | 
						|
			this.kind = image.Kind;
 | 
						|
			this.RuntimeVersion = image.RuntimeVersion;
 | 
						|
			this.architecture = image.Architecture;
 | 
						|
			this.attributes = image.Attributes;
 | 
						|
			this.characteristics = image.DllCharacteristics;
 | 
						|
			this.linker_version = image.LinkerVersion;
 | 
						|
			this.subsystem_major = image.SubSystemMajor;
 | 
						|
			this.subsystem_minor = image.SubSystemMinor;
 | 
						|
			this.file_name = image.FileName;
 | 
						|
			this.timestamp = image.Timestamp;
 | 
						|
 | 
						|
			this.reader = new MetadataReader (this);
 | 
						|
		}
 | 
						|
 | 
						|
		public void Dispose ()
 | 
						|
		{
 | 
						|
			if (Image != null)
 | 
						|
				Image.Dispose ();
 | 
						|
 | 
						|
			if (symbol_reader != null)
 | 
						|
				symbol_reader.Dispose ();
 | 
						|
 | 
						|
			if (assembly_resolver.value != null)
 | 
						|
				assembly_resolver.Dispose ();
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasTypeReference (string fullName)
 | 
						|
		{
 | 
						|
			return HasTypeReference (string.Empty, fullName);
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasTypeReference (string scope, string fullName)
 | 
						|
		{
 | 
						|
			Mixin.CheckFullName (fullName);
 | 
						|
 | 
						|
			if (!HasImage)
 | 
						|
				return false;
 | 
						|
 | 
						|
			return GetTypeReference (scope, fullName) != null;
 | 
						|
		}
 | 
						|
 | 
						|
		public bool TryGetTypeReference (string fullName, out TypeReference type)
 | 
						|
		{
 | 
						|
			return TryGetTypeReference (string.Empty, fullName, out type);
 | 
						|
		}
 | 
						|
 | 
						|
		public bool TryGetTypeReference (string scope, string fullName, out TypeReference type)
 | 
						|
		{
 | 
						|
			Mixin.CheckFullName (fullName);
 | 
						|
 | 
						|
			if (!HasImage) {
 | 
						|
				type = null;
 | 
						|
				return false;
 | 
						|
			}
 | 
						|
 | 
						|
			return (type = GetTypeReference (scope, fullName)) != null;
 | 
						|
		}
 | 
						|
 | 
						|
		TypeReference GetTypeReference (string scope, string fullname)
 | 
						|
		{
 | 
						|
			return Read (new Row<string, string> (scope, fullname), (row, reader) => reader.GetTypeReference (row.Col1, row.Col2));
 | 
						|
		}
 | 
						|
 | 
						|
		public IEnumerable<TypeReference> GetTypeReferences ()
 | 
						|
		{
 | 
						|
			if (!HasImage)
 | 
						|
				return Empty<TypeReference>.Array;
 | 
						|
 | 
						|
			return Read (this, (_, reader) => reader.GetTypeReferences ());
 | 
						|
		}
 | 
						|
 | 
						|
		public IEnumerable<MemberReference> GetMemberReferences ()
 | 
						|
		{
 | 
						|
			if (!HasImage)
 | 
						|
				return Empty<MemberReference>.Array;
 | 
						|
 | 
						|
			return Read (this, (_, reader) => reader.GetMemberReferences ());
 | 
						|
		}
 | 
						|
 | 
						|
		public IEnumerable<CustomAttribute> GetCustomAttributes ()
 | 
						|
		{
 | 
						|
			if (!HasImage)
 | 
						|
				return Empty<CustomAttribute>.Array;
 | 
						|
 | 
						|
			return Read (this, (_, reader) => reader.GetCustomAttributes ());
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeReference GetType (string fullName, bool runtimeName)
 | 
						|
		{
 | 
						|
			return runtimeName
 | 
						|
				? TypeParser.ParseType (this, fullName, typeDefinitionOnly: true)
 | 
						|
				: GetType (fullName);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeDefinition GetType (string fullName)
 | 
						|
		{
 | 
						|
			Mixin.CheckFullName (fullName);
 | 
						|
 | 
						|
			var position = fullName.IndexOf ('/');
 | 
						|
			if (position > 0)
 | 
						|
				return GetNestedType (fullName);
 | 
						|
 | 
						|
			return ((TypeDefinitionCollection)this.Types).GetType (fullName);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeDefinition GetType (string @namespace, string name)
 | 
						|
		{
 | 
						|
			Mixin.CheckName (name);
 | 
						|
 | 
						|
			return ((TypeDefinitionCollection)this.Types).GetType (@namespace ?? string.Empty, name);
 | 
						|
		}
 | 
						|
 | 
						|
		public IEnumerable<TypeDefinition> GetTypes ()
 | 
						|
		{
 | 
						|
			return GetTypes (Types);
 | 
						|
		}
 | 
						|
 | 
						|
		static IEnumerable<TypeDefinition> GetTypes (Collection<TypeDefinition> types)
 | 
						|
		{
 | 
						|
			for (int i = 0; i < types.Count; i++) {
 | 
						|
				var type = types [i];
 | 
						|
 | 
						|
				yield return type;
 | 
						|
 | 
						|
				if (!type.HasNestedTypes)
 | 
						|
					continue;
 | 
						|
 | 
						|
				foreach (var nested in GetTypes (type.NestedTypes))
 | 
						|
					yield return nested;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		TypeDefinition GetNestedType (string fullname)
 | 
						|
		{
 | 
						|
			var names = fullname.Split ('/');
 | 
						|
			var type = GetType (names [0]);
 | 
						|
 | 
						|
			if (type == null)
 | 
						|
				return null;
 | 
						|
 | 
						|
			for (int i = 1; i < names.Length; i++) {
 | 
						|
				var nested_type = type.GetNestedType (names [i]);
 | 
						|
				if (nested_type == null)
 | 
						|
					return null;
 | 
						|
 | 
						|
				type = nested_type;
 | 
						|
			}
 | 
						|
 | 
						|
			return type;
 | 
						|
		}
 | 
						|
 | 
						|
		internal FieldDefinition Resolve (FieldReference field)
 | 
						|
		{
 | 
						|
			return MetadataResolver.Resolve (field);
 | 
						|
		}
 | 
						|
 | 
						|
		internal MethodDefinition Resolve (MethodReference method)
 | 
						|
		{
 | 
						|
			return MetadataResolver.Resolve (method);
 | 
						|
		}
 | 
						|
 | 
						|
		internal TypeDefinition Resolve (TypeReference type)
 | 
						|
		{
 | 
						|
			return MetadataResolver.Resolve (type);
 | 
						|
		}
 | 
						|
 | 
						|
		static void CheckContext (IGenericParameterProvider context, ModuleDefinition module)
 | 
						|
		{
 | 
						|
			if (context == null)
 | 
						|
				return;
 | 
						|
 | 
						|
			if (context.Module != module)
 | 
						|
				throw new ArgumentException ();
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public TypeReference Import (Type type)
 | 
						|
		{
 | 
						|
			return ImportReference (type, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeReference ImportReference (Type type)
 | 
						|
		{
 | 
						|
			return ImportReference (type, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public TypeReference Import (Type type, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (type, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeReference ImportReference (Type type, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckType (type);
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return ReflectionImporter.ImportReference (type, context);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public FieldReference Import (SR.FieldInfo field)
 | 
						|
		{
 | 
						|
			return ImportReference (field, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public FieldReference Import (SR.FieldInfo field, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (field, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public FieldReference ImportReference (SR.FieldInfo field)
 | 
						|
		{
 | 
						|
			return ImportReference (field, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public FieldReference ImportReference (SR.FieldInfo field, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckField (field);
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return ReflectionImporter.ImportReference (field, context);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public MethodReference Import (SR.MethodBase method)
 | 
						|
		{
 | 
						|
			return ImportReference (method, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public MethodReference Import (SR.MethodBase method, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (method, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public MethodReference ImportReference (SR.MethodBase method)
 | 
						|
		{
 | 
						|
			return ImportReference (method, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public MethodReference ImportReference (SR.MethodBase method, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckMethod (method);
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return ReflectionImporter.ImportReference (method, context);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public TypeReference Import (TypeReference type)
 | 
						|
		{
 | 
						|
			return ImportReference (type, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public TypeReference Import (TypeReference type, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (type, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeReference ImportReference (TypeReference type)
 | 
						|
		{
 | 
						|
			return ImportReference (type, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public TypeReference ImportReference (TypeReference type, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckType (type);
 | 
						|
 | 
						|
			if (type.Module == this)
 | 
						|
				return type;
 | 
						|
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return MetadataImporter.ImportReference (type, context);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public FieldReference Import (FieldReference field)
 | 
						|
		{
 | 
						|
			return ImportReference (field, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public FieldReference Import (FieldReference field, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (field, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public FieldReference ImportReference (FieldReference field)
 | 
						|
		{
 | 
						|
			return ImportReference (field, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public FieldReference ImportReference (FieldReference field, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckField (field);
 | 
						|
 | 
						|
			if (field.Module == this)
 | 
						|
				return field;
 | 
						|
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return MetadataImporter.ImportReference (field, context);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public MethodReference Import (MethodReference method)
 | 
						|
		{
 | 
						|
			return ImportReference (method, null);
 | 
						|
		}
 | 
						|
 | 
						|
		[Obsolete ("Use ImportReference", error: false)]
 | 
						|
		public MethodReference Import (MethodReference method, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			return ImportReference (method, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public MethodReference ImportReference (MethodReference method)
 | 
						|
		{
 | 
						|
			return ImportReference (method, null);
 | 
						|
		}
 | 
						|
 | 
						|
		public MethodReference ImportReference (MethodReference method, IGenericParameterProvider context)
 | 
						|
		{
 | 
						|
			Mixin.CheckMethod (method);
 | 
						|
 | 
						|
			if (method.Module == this)
 | 
						|
				return method;
 | 
						|
 | 
						|
			CheckContext (context, this);
 | 
						|
 | 
						|
			return MetadataImporter.ImportReference (method, context);
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataTokenProvider LookupToken (int token)
 | 
						|
		{
 | 
						|
			return LookupToken (new MetadataToken ((uint)token));
 | 
						|
		}
 | 
						|
 | 
						|
		public IMetadataTokenProvider LookupToken (MetadataToken token)
 | 
						|
		{
 | 
						|
			return Read (token, (t, reader) => reader.LookupToken (t));
 | 
						|
		}
 | 
						|
 | 
						|
		public void ImmediateRead ()
 | 
						|
		{
 | 
						|
			if (!HasImage)
 | 
						|
				return;
 | 
						|
			ReadingMode = ReadingMode.Immediate;
 | 
						|
			var moduleReader = new ImmediateModuleReader (Image);
 | 
						|
			moduleReader.ReadModule (this, resolve_attributes: true);
 | 
						|
		}
 | 
						|
 | 
						|
		readonly object module_lock = new object ();
 | 
						|
 | 
						|
		internal object SyncRoot {
 | 
						|
			get { return module_lock; }
 | 
						|
		}
 | 
						|
 | 
						|
		internal void Read<TItem> (TItem item, Action<TItem, MetadataReader> read)
 | 
						|
		{
 | 
						|
			lock (module_lock) {
 | 
						|
				var position = reader.position;
 | 
						|
				var context = reader.context;
 | 
						|
 | 
						|
				read (item, reader);
 | 
						|
 | 
						|
				reader.position = position;
 | 
						|
				reader.context = context;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		internal TRet Read<TItem, TRet> (TItem item, Func<TItem, MetadataReader, TRet> read)
 | 
						|
		{
 | 
						|
			lock (module_lock) {
 | 
						|
				var position = reader.position;
 | 
						|
				var context = reader.context;
 | 
						|
 | 
						|
				var ret = read (item, reader);
 | 
						|
 | 
						|
				reader.position = position;
 | 
						|
				reader.context = context;
 | 
						|
 | 
						|
				return ret;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		internal TRet Read<TItem, TRet> (ref TRet variable, TItem item, Func<TItem, MetadataReader, TRet> read) where TRet : class
 | 
						|
		{
 | 
						|
			lock (module_lock) {
 | 
						|
				if (variable != null)
 | 
						|
					return variable;
 | 
						|
 | 
						|
				var position = reader.position;
 | 
						|
				var context = reader.context;
 | 
						|
 | 
						|
				var ret = read (item, reader);
 | 
						|
 | 
						|
				reader.position = position;
 | 
						|
				reader.context = context;
 | 
						|
 | 
						|
				return variable = ret;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public bool HasDebugHeader {
 | 
						|
			get { return Image != null && Image.DebugHeader != null; }
 | 
						|
		}
 | 
						|
 | 
						|
		public ImageDebugHeader GetDebugHeader ()
 | 
						|
		{
 | 
						|
			return Image.DebugHeader ?? new ImageDebugHeader ();
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition CreateModule (string name, ModuleKind kind)
 | 
						|
		{
 | 
						|
			return CreateModule (name, new ModuleParameters { Kind = kind });
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition CreateModule (string name, ModuleParameters parameters)
 | 
						|
		{
 | 
						|
			Mixin.CheckName (name);
 | 
						|
			Mixin.CheckParameters (parameters);
 | 
						|
 | 
						|
			var module = new ModuleDefinition {
 | 
						|
				Name = name,
 | 
						|
				kind = parameters.Kind,
 | 
						|
				timestamp = parameters.Timestamp ?? Mixin.GetTimestamp (),
 | 
						|
				Runtime = parameters.Runtime,
 | 
						|
				architecture = parameters.Architecture,
 | 
						|
				mvid = Guid.NewGuid (),
 | 
						|
				Attributes = ModuleAttributes.ILOnly,
 | 
						|
				Characteristics = (ModuleCharacteristics)0x8540,
 | 
						|
			};
 | 
						|
 | 
						|
			if (parameters.AssemblyResolver != null)
 | 
						|
				module.assembly_resolver = Disposable.NotOwned (parameters.AssemblyResolver);
 | 
						|
 | 
						|
			if (parameters.MetadataResolver != null)
 | 
						|
				module.metadata_resolver = parameters.MetadataResolver;
 | 
						|
 | 
						|
			if (parameters.MetadataImporterProvider != null)
 | 
						|
				module.metadata_importer = parameters.MetadataImporterProvider.GetMetadataImporter (module);
 | 
						|
 | 
						|
			if (parameters.ReflectionImporterProvider != null)
 | 
						|
				module.reflection_importer = parameters.ReflectionImporterProvider.GetReflectionImporter (module);
 | 
						|
 | 
						|
			if (parameters.Kind != ModuleKind.NetModule) {
 | 
						|
				var assembly = new AssemblyDefinition ();
 | 
						|
				module.assembly = assembly;
 | 
						|
				module.assembly.Name = CreateAssemblyName (name);
 | 
						|
				assembly.main_module = module;
 | 
						|
			}
 | 
						|
 | 
						|
			module.Types.Add (new TypeDefinition (string.Empty, "<Module>", TypeAttributes.NotPublic));
 | 
						|
 | 
						|
			return module;
 | 
						|
		}
 | 
						|
 | 
						|
		static AssemblyNameDefinition CreateAssemblyName (string name)
 | 
						|
		{
 | 
						|
			if (name.EndsWith (".dll") || name.EndsWith (".exe"))
 | 
						|
				name = name.Substring (0, name.Length - 4);
 | 
						|
 | 
						|
			return new AssemblyNameDefinition (name, Mixin.ZeroVersion);
 | 
						|
		}
 | 
						|
 | 
						|
		public void ReadSymbols ()
 | 
						|
		{
 | 
						|
			if (string.IsNullOrEmpty (file_name))
 | 
						|
				throw new InvalidOperationException ();
 | 
						|
 | 
						|
			var provider = new DefaultSymbolReaderProvider (throwIfNoSymbol: true);
 | 
						|
			ReadSymbols (provider.GetSymbolReader (this, file_name), throwIfSymbolsAreNotMaching: true);
 | 
						|
		}
 | 
						|
 | 
						|
		public void ReadSymbols (ISymbolReader reader)
 | 
						|
		{
 | 
						|
			ReadSymbols (reader, throwIfSymbolsAreNotMaching: true);
 | 
						|
		}
 | 
						|
 | 
						|
		public void ReadSymbols (ISymbolReader reader, bool throwIfSymbolsAreNotMaching)
 | 
						|
		{
 | 
						|
			if (reader == null)
 | 
						|
				throw new ArgumentNullException ("reader");
 | 
						|
 | 
						|
			symbol_reader = reader;
 | 
						|
 | 
						|
			if (!symbol_reader.ProcessDebugHeader (GetDebugHeader ())) {
 | 
						|
				symbol_reader = null;
 | 
						|
 | 
						|
				if (throwIfSymbolsAreNotMaching)
 | 
						|
					throw new SymbolsNotMatchingException ("Symbols were found but are not matching the assembly");
 | 
						|
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			if (HasImage && ReadingMode == ReadingMode.Immediate) {
 | 
						|
				var immediate_reader = new ImmediateModuleReader (Image);
 | 
						|
				immediate_reader.ReadSymbols (this);
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition ReadModule (string fileName)
 | 
						|
		{
 | 
						|
			return ReadModule (fileName, new ReaderParameters (ReadingMode.Deferred));
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition ReadModule (string fileName, ReaderParameters parameters)
 | 
						|
		{
 | 
						|
			var stream = GetFileStream (fileName, FileMode.Open, parameters.ReadWrite ? FileAccess.ReadWrite : FileAccess.Read, FileShare.Read);
 | 
						|
 | 
						|
			if (parameters.InMemory) {
 | 
						|
				var memory = new MemoryStream (stream.CanSeek ? (int)stream.Length : 0);
 | 
						|
				using (stream)
 | 
						|
					stream.CopyTo (memory);
 | 
						|
 | 
						|
				memory.Position = 0;
 | 
						|
				stream = memory;
 | 
						|
			}
 | 
						|
 | 
						|
			try {
 | 
						|
				return ReadModule (Disposable.Owned (stream), fileName, parameters);
 | 
						|
			}
 | 
						|
			catch (Exception) {
 | 
						|
				stream.Dispose ();
 | 
						|
				throw;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		static Stream GetFileStream (string fileName, FileMode mode, FileAccess access, FileShare share)
 | 
						|
		{
 | 
						|
			Mixin.CheckFileName (fileName);
 | 
						|
 | 
						|
			return new FileStream (fileName, mode, access, share);
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition ReadModule (Stream stream)
 | 
						|
		{
 | 
						|
			return ReadModule (stream, new ReaderParameters (ReadingMode.Deferred));
 | 
						|
		}
 | 
						|
 | 
						|
		public static ModuleDefinition ReadModule (Stream stream, ReaderParameters parameters)
 | 
						|
		{
 | 
						|
			Mixin.CheckStream (stream);
 | 
						|
			Mixin.CheckReadSeek (stream);
 | 
						|
 | 
						|
			return ReadModule (Disposable.NotOwned (stream), stream.GetFileName (), parameters);
 | 
						|
		}
 | 
						|
 | 
						|
		static ModuleDefinition ReadModule (Disposable<Stream> stream, string fileName, ReaderParameters parameters)
 | 
						|
		{
 | 
						|
			Mixin.CheckParameters (parameters);
 | 
						|
 | 
						|
			return ModuleReader.CreateModule (
 | 
						|
				ImageReader.ReadImage (stream, fileName),
 | 
						|
				parameters);
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write (string fileName)
 | 
						|
		{
 | 
						|
			Write (fileName, new WriterParameters ());
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write (string fileName, WriterParameters parameters)
 | 
						|
		{
 | 
						|
			Mixin.CheckParameters (parameters);
 | 
						|
			var file = GetFileStream (fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
 | 
						|
			ModuleWriter.WriteModule (this, Disposable.Owned (file), parameters);
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write ()
 | 
						|
		{
 | 
						|
			Write (new WriterParameters ());
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write (WriterParameters parameters)
 | 
						|
		{
 | 
						|
			if (!HasImage)
 | 
						|
				throw new InvalidOperationException ();
 | 
						|
 | 
						|
			Write (Image.Stream.value, parameters);
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write (Stream stream)
 | 
						|
		{
 | 
						|
			Write (stream, new WriterParameters ());
 | 
						|
		}
 | 
						|
 | 
						|
		public void Write (Stream stream, WriterParameters parameters)
 | 
						|
		{
 | 
						|
			Mixin.CheckStream (stream);
 | 
						|
			Mixin.CheckWriteSeek (stream);
 | 
						|
			Mixin.CheckParameters (parameters);
 | 
						|
 | 
						|
			ModuleWriter.WriteModule (this, Disposable.NotOwned (stream), parameters);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	static partial class Mixin {
 | 
						|
 | 
						|
		public enum Argument {
 | 
						|
			name,
 | 
						|
			fileName,
 | 
						|
			fullName,
 | 
						|
			stream,
 | 
						|
			type,
 | 
						|
			method,
 | 
						|
			field,
 | 
						|
			parameters,
 | 
						|
			module,
 | 
						|
			modifierType,
 | 
						|
			eventType,
 | 
						|
			fieldType,
 | 
						|
			declaringType,
 | 
						|
			returnType,
 | 
						|
			propertyType,
 | 
						|
			interfaceType,
 | 
						|
			constraintType,
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckName (object name)
 | 
						|
		{
 | 
						|
			if (name == null)
 | 
						|
				throw new ArgumentNullException (Argument.name.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckName (string name)
 | 
						|
		{
 | 
						|
			if (string.IsNullOrEmpty (name))
 | 
						|
				throw new ArgumentNullOrEmptyException (Argument.name.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckFileName (string fileName)
 | 
						|
		{
 | 
						|
			if (string.IsNullOrEmpty (fileName))
 | 
						|
				throw new ArgumentNullOrEmptyException (Argument.fileName.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckFullName (string fullName)
 | 
						|
		{
 | 
						|
			if (string.IsNullOrEmpty (fullName))
 | 
						|
				throw new ArgumentNullOrEmptyException (Argument.fullName.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckStream (object stream)
 | 
						|
		{
 | 
						|
			if (stream == null)
 | 
						|
				throw new ArgumentNullException (Argument.stream.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckWriteSeek (Stream stream)
 | 
						|
		{
 | 
						|
			if (!stream.CanWrite || !stream.CanSeek)
 | 
						|
				throw new ArgumentException ("Stream must be writable and seekable.");
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckReadSeek (Stream stream)
 | 
						|
		{
 | 
						|
			if (!stream.CanRead || !stream.CanSeek)
 | 
						|
				throw new ArgumentException ("Stream must be readable and seekable.");
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckType (object type)
 | 
						|
		{
 | 
						|
			if (type == null)
 | 
						|
				throw new ArgumentNullException (Argument.type.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckType (object type, Argument argument)
 | 
						|
		{
 | 
						|
			if (type == null)
 | 
						|
				throw new ArgumentNullException (argument.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckField (object field)
 | 
						|
		{
 | 
						|
			if (field == null)
 | 
						|
				throw new ArgumentNullException (Argument.field.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckMethod (object method)
 | 
						|
		{
 | 
						|
			if (method == null)
 | 
						|
				throw new ArgumentNullException (Argument.method.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static void CheckParameters (object parameters)
 | 
						|
		{
 | 
						|
			if (parameters == null)
 | 
						|
				throw new ArgumentNullException (Argument.parameters.ToString ());
 | 
						|
		}
 | 
						|
 | 
						|
		public static uint GetTimestamp ()
 | 
						|
		{
 | 
						|
			return (uint)DateTime.UtcNow.Subtract (new DateTime (1970, 1, 1)).TotalSeconds;
 | 
						|
		}
 | 
						|
 | 
						|
		public static bool HasImage (this ModuleDefinition self)
 | 
						|
		{
 | 
						|
			return self != null && self.HasImage;
 | 
						|
		}
 | 
						|
 | 
						|
		public static string GetFileName (this Stream self)
 | 
						|
		{
 | 
						|
			var file_stream = self as FileStream;
 | 
						|
			if (file_stream == null)
 | 
						|
				return string.Empty;
 | 
						|
 | 
						|
			return Path.GetFullPath (file_stream.Name);
 | 
						|
		}
 | 
						|
 | 
						|
		public static TargetRuntime ParseRuntime (this string self)
 | 
						|
		{
 | 
						|
			if (string.IsNullOrEmpty (self))
 | 
						|
				return TargetRuntime.Net_4_0;
 | 
						|
 | 
						|
			switch (self [1]) {
 | 
						|
			case '1':
 | 
						|
				return self [3] == '0'
 | 
						|
					? TargetRuntime.Net_1_0
 | 
						|
					: TargetRuntime.Net_1_1;
 | 
						|
			case '2':
 | 
						|
				return TargetRuntime.Net_2_0;
 | 
						|
			case '4':
 | 
						|
			default:
 | 
						|
				return TargetRuntime.Net_4_0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public static string RuntimeVersionString (this TargetRuntime runtime)
 | 
						|
		{
 | 
						|
			switch (runtime) {
 | 
						|
			case TargetRuntime.Net_1_0:
 | 
						|
				return "v1.0.3705";
 | 
						|
			case TargetRuntime.Net_1_1:
 | 
						|
				return "v1.1.4322";
 | 
						|
			case TargetRuntime.Net_2_0:
 | 
						|
				return "v2.0.50727";
 | 
						|
			case TargetRuntime.Net_4_0:
 | 
						|
			default:
 | 
						|
				return "v4.0.30319";
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public static bool IsWindowsMetadata (this ModuleDefinition module)
 | 
						|
		{
 | 
						|
			return module.MetadataKind != MetadataKind.Ecma335;
 | 
						|
		}
 | 
						|
 | 
						|
		public static byte [] ReadAll (this Stream self)
 | 
						|
		{
 | 
						|
			int read;
 | 
						|
			var memory = new MemoryStream ((int)self.Length);
 | 
						|
			var buffer = new byte [1024];
 | 
						|
 | 
						|
			while ((read = self.Read (buffer, 0, buffer.Length)) != 0)
 | 
						|
				memory.Write (buffer, 0, read);
 | 
						|
 | 
						|
			return memory.ToArray ();
 | 
						|
		}
 | 
						|
 | 
						|
		public static void Read (object o)
 | 
						|
		{
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |