1 // 2 // AssemblyDefinition.cs 3 // 4 // Author: 5 // Jb Evain (jbevain@gmail.com) 6 // 7 // Copyright (c) 2008 - 2011 Jb Evain 8 // 9 // Permission is hereby granted, free of charge, to any person obtaining 10 // a copy of this software and associated documentation files (the 11 // "Software"), to deal in the Software without restriction, including 12 // without limitation the rights to use, copy, modify, merge, publish, 13 // distribute, sublicense, and/or sell copies of the Software, and to 14 // permit persons to whom the Software is furnished to do so, subject to 15 // the following conditions: 16 // 17 // The above copyright notice and this permission notice shall be 18 // included in all copies or substantial portions of the Software. 19 // 20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 // 28 29 using System; 30 using System.IO; 31 32 using Mono.Collections.Generic; 33 34 namespace Mono.Cecil { 35 36 public sealed class AssemblyDefinition : ICustomAttributeProvider, ISecurityDeclarationProvider { 37 38 AssemblyNameDefinition name; 39 40 internal ModuleDefinition main_module; 41 Collection<ModuleDefinition> modules; 42 Collection<CustomAttribute> custom_attributes; 43 Collection<SecurityDeclaration> security_declarations; 44 45 public AssemblyNameDefinition Name { 46 get { return name; } 47 set { name = value; } 48 } 49 50 public string FullName { 51 get { return name != null ? name.FullName : string.Empty; } 52 } 53 54 public MetadataToken MetadataToken { 55 get { return new MetadataToken (TokenType.Assembly, 1); } 56 set { } 57 } 58 59 public Collection<ModuleDefinition> Modules { 60 get { 61 if (modules != null) 62 return modules; 63 64 if (main_module.HasImage) 65 return modules = main_module.Read (this, (_, reader) => reader.ReadModules ()); 66 67 return modules = new Collection<ModuleDefinition> (1) { main_module }; 68 } 69 } 70 71 public ModuleDefinition MainModule { 72 get { return main_module; } 73 } 74 75 public MethodDefinition EntryPoint { 76 get { return main_module.EntryPoint; } 77 set { main_module.EntryPoint = value; } 78 } 79 80 public bool HasCustomAttributes { 81 get { 82 if (custom_attributes != null) 83 return custom_attributes.Count > 0; 84 85 return this.GetHasCustomAttributes (main_module); 86 } 87 } 88 89 public Collection<CustomAttribute> CustomAttributes { 90 get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (main_module)); } 91 } 92 93 public bool HasSecurityDeclarations { 94 get { 95 if (security_declarations != null) 96 return security_declarations.Count > 0; 97 98 return this.GetHasSecurityDeclarations (main_module); 99 } 100 } 101 102 public Collection<SecurityDeclaration> SecurityDeclarations { 103 get { return security_declarations ?? (security_declarations = this.GetSecurityDeclarations (main_module)); } 104 } 105 AssemblyDefinition()106 internal AssemblyDefinition () 107 { 108 } 109 110 #if !READ_ONLY CreateAssembly(AssemblyNameDefinition assemblyName, string moduleName, ModuleKind kind)111 public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleKind kind) 112 { 113 return CreateAssembly (assemblyName, moduleName, new ModuleParameters { Kind = kind }); 114 } 115 CreateAssembly(AssemblyNameDefinition assemblyName, string moduleName, ModuleParameters parameters)116 public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleParameters parameters) 117 { 118 if (assemblyName == null) 119 throw new ArgumentNullException ("assemblyName"); 120 if (moduleName == null) 121 throw new ArgumentNullException ("moduleName"); 122 Mixin.CheckParameters (parameters); 123 if (parameters.Kind == ModuleKind.NetModule) 124 throw new ArgumentException ("kind"); 125 126 var assembly = ModuleDefinition.CreateModule (moduleName, parameters).Assembly; 127 assembly.Name = assemblyName; 128 129 return assembly; 130 } 131 #endif 132 ReadAssembly(string fileName)133 public static AssemblyDefinition ReadAssembly (string fileName) 134 { 135 return ReadAssembly (ModuleDefinition.ReadModule (fileName)); 136 } 137 ReadAssembly(string fileName, ReaderParameters parameters)138 public static AssemblyDefinition ReadAssembly (string fileName, ReaderParameters parameters) 139 { 140 return ReadAssembly (ModuleDefinition.ReadModule (fileName, parameters)); 141 } 142 ReadAssembly(Stream stream)143 public static AssemblyDefinition ReadAssembly (Stream stream) 144 { 145 return ReadAssembly (ModuleDefinition.ReadModule (stream)); 146 } 147 ReadAssembly(Stream stream, ReaderParameters parameters)148 public static AssemblyDefinition ReadAssembly (Stream stream, ReaderParameters parameters) 149 { 150 return ReadAssembly (ModuleDefinition.ReadModule (stream, parameters)); 151 } 152 ReadAssembly(ModuleDefinition module)153 static AssemblyDefinition ReadAssembly (ModuleDefinition module) 154 { 155 var assembly = module.Assembly; 156 if (assembly == null) 157 throw new ArgumentException (); 158 159 return assembly; 160 } 161 162 #if !READ_ONLY Write(string fileName)163 public void Write (string fileName) 164 { 165 Write (fileName, new WriterParameters ()); 166 } 167 Write(Stream stream)168 public void Write (Stream stream) 169 { 170 Write (stream, new WriterParameters ()); 171 } 172 Write(string fileName, WriterParameters parameters)173 public void Write (string fileName, WriterParameters parameters) 174 { 175 main_module.Write (fileName, parameters); 176 } 177 Write(Stream stream, WriterParameters parameters)178 public void Write (Stream stream, WriterParameters parameters) 179 { 180 main_module.Write (stream, parameters); 181 } 182 #endif 183 ToString()184 public override string ToString () 185 { 186 return this.FullName; 187 } 188 } 189 } 190