26
26
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
using Mono.Collections.Generic;
29
34
namespace Mono.Cecil {
32
using System.Collections;
34
using Mono.Cecil.Metadata;
36
public class AssemblyDefinition : ICustomAttributeProvider,
37
IHasSecurity, IAnnotationProvider, IReflectionStructureVisitable {
39
MetadataToken m_token;
40
AssemblyNameDefinition m_asmName;
41
ModuleDefinitionCollection m_modules;
42
SecurityDeclarationCollection m_secDecls;
43
CustomAttributeCollection m_customAttrs;
44
MethodDefinition m_ep;
45
TargetRuntime m_runtime;
48
ModuleDefinition m_mainModule;
49
StructureReader m_reader;
51
IAssemblyResolver m_resolver;
52
IDictionary m_annotations;
36
public sealed class AssemblyDefinition : ICustomAttributeProvider, ISecurityDeclarationProvider {
38
AssemblyNameDefinition name;
40
internal ModuleDefinition main_module;
41
Collection<ModuleDefinition> modules;
42
Collection<CustomAttribute> custom_attributes;
43
Collection<SecurityDeclaration> security_declarations;
45
public AssemblyNameDefinition Name {
50
public string FullName {
51
get { return name != null ? name.FullName : string.Empty; }
54
54
public MetadataToken MetadataToken {
55
get { return m_token; }
56
set { m_token = value; }
59
public AssemblyNameDefinition Name {
60
get { return m_asmName; }
63
public ModuleDefinitionCollection Modules {
64
get { return m_modules; }
55
get { return new MetadataToken (TokenType.Assembly, 1); }
59
public Collection<ModuleDefinition> Modules {
64
if (main_module.HasImage)
65
return modules = main_module.Read (this, (_, reader) => reader.ReadModules ());
67
return modules = new Collection<ModuleDefinition> { main_module };
71
public ModuleDefinition MainModule {
72
get { return main_module; }
75
public MethodDefinition EntryPoint {
76
get { return main_module.EntryPoint; }
77
set { main_module.EntryPoint = value; }
80
public bool HasCustomAttributes {
82
if (custom_attributes != null)
83
return custom_attributes.Count > 0;
85
return this.GetHasCustomAttributes (main_module);
89
public Collection<CustomAttribute> CustomAttributes {
90
get { return custom_attributes ?? (custom_attributes = this.GetCustomAttributes (main_module)); }
67
93
public bool HasSecurityDeclarations {
68
get { return (m_secDecls == null) ? false : (m_secDecls.Count > 0); }
71
public SecurityDeclarationCollection SecurityDeclarations {
73
if (m_secDecls == null)
74
m_secDecls = new SecurityDeclarationCollection (this);
80
public bool HasCustomAttributes {
81
get { return (m_customAttrs == null) ? false : (m_customAttrs.Count > 0); }
84
public CustomAttributeCollection CustomAttributes {
86
if (m_customAttrs == null)
87
m_customAttrs = new CustomAttributeCollection (this);
93
public MethodDefinition EntryPoint {
98
public TargetRuntime Runtime {
99
get { return m_runtime; }
100
set { m_runtime = value; }
103
public AssemblyKind Kind {
104
get { return m_kind; }
105
set { m_kind = value; }
108
public ModuleDefinition MainModule {
110
if (m_mainModule == null) {
111
foreach (ModuleDefinition module in m_modules) {
113
m_mainModule = module;
122
internal StructureReader Reader {
123
get { return m_reader; }
126
public IAssemblyResolver Resolver {
127
get { return m_resolver; }
128
set { m_resolver = value; }
131
IDictionary IAnnotationProvider.Annotations {
133
if (m_annotations == null)
134
m_annotations = new Hashtable ();
135
return m_annotations;
139
internal AssemblyDefinition (AssemblyNameDefinition name)
142
throw new ArgumentNullException ("name");
145
m_modules = new ModuleDefinitionCollection (this);
146
m_resolver = new DefaultAssemblyResolver ();
149
internal AssemblyDefinition (AssemblyNameDefinition name, StructureReader reader) : this (name)
154
public void Accept (IReflectionStructureVisitor visitor)
156
visitor.VisitAssemblyDefinition (this);
158
m_asmName.Accept (visitor);
159
m_modules.Accept (visitor);
161
visitor.TerminateAssemblyDefinition (this);
95
if (security_declarations != null)
96
return security_declarations.Count > 0;
98
return this.GetHasSecurityDeclarations (main_module);
102
public Collection<SecurityDeclaration> SecurityDeclarations {
103
get { return security_declarations ?? (security_declarations = this.GetSecurityDeclarations (main_module)); }
106
internal AssemblyDefinition ()
111
public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleKind kind)
113
return CreateAssembly (assemblyName, moduleName, new ModuleParameters { Kind = kind });
116
public static AssemblyDefinition CreateAssembly (AssemblyNameDefinition assemblyName, string moduleName, ModuleParameters parameters)
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");
126
var assembly = ModuleDefinition.CreateModule (moduleName, parameters).Assembly;
127
assembly.Name = assemblyName;
133
public static AssemblyDefinition ReadAssembly (string fileName)
135
return ReadAssembly (ModuleDefinition.ReadModule (fileName));
138
public static AssemblyDefinition ReadAssembly (string fileName, ReaderParameters parameters)
140
return ReadAssembly (ModuleDefinition.ReadModule (fileName, parameters));
143
public static AssemblyDefinition ReadAssembly (Stream stream)
145
return ReadAssembly (ModuleDefinition.ReadModule (stream));
148
public static AssemblyDefinition ReadAssembly (Stream stream, ReaderParameters parameters)
150
return ReadAssembly (ModuleDefinition.ReadModule (stream, parameters));
153
static AssemblyDefinition ReadAssembly (ModuleDefinition module)
155
var assembly = module.Assembly;
156
if (assembly == null)
157
throw new ArgumentException ();
163
public void Write (string fileName)
165
Write (fileName, new WriterParameters ());
168
public void Write (Stream stream)
170
Write (stream, new WriterParameters ());
173
public void Write (string fileName, WriterParameters parameters)
175
main_module.Write (fileName, parameters);
178
public void Write (Stream stream, WriterParameters parameters)
180
main_module.Write (stream, parameters);
164
184
public override string ToString ()
166
return m_asmName.FullName;
186
return this.FullName;