2 // System.Reflection.Emit/AssemblyBuilder.cs
5 // Paolo Molaro (lupus@ximian.com)
7 // (C) 2001 Ximian, Inc. http://www.ximian.com
11 using System.Reflection;
12 using System.Resources;
14 using System.Security.Policy;
15 using System.Runtime.Serialization;
16 using System.Globalization;
17 using System.Runtime.CompilerServices;
18 using System.Collections;
20 namespace System.Reflection.Emit {
22 public sealed class AssemblyBuilder : Assembly {
23 private IntPtr dynamic_assembly;
24 private MethodInfo entry_point;
25 private ModuleBuilder[] modules;
28 private CustomAttributeBuilder[] cattrs;
29 private int[] table_indexes;
30 internal ArrayList methods;
32 [MethodImplAttribute(MethodImplOptions.InternalCall)]
33 private static extern void basic_init (AssemblyBuilder ab);
35 internal AssemblyBuilder (AssemblyName n, string directory, AssemblyBuilderAccess access) {
41 internal int get_next_table_index (object obj, int table, bool inc) {
42 if (table_indexes == null) {
43 table_indexes = new int [64];
44 for (int i=0; i < 64; ++i)
45 table_indexes [i] = 1;
46 /* allow room for .<Module> in TypeDef table */
47 table_indexes [0x02] = 2;
49 // Console.WriteLine ("getindex for table "+table.ToString()+" got "+table_indexes [table].ToString());
51 if ((table == 0x06) && (methods != null))
53 return table_indexes [table]++;
55 return table_indexes [table];
58 public override string CodeBase {
64 public override MethodInfo EntryPoint {
70 public override string Location {
76 public void AddResourceFile (string name, string fileName)
80 public void AddResourceFile (string name, string fileName, ResourceAttributes attribute)
84 public ModuleBuilder DefineDynamicModule (string name)
86 return DefineDynamicModule (name, name, false);
89 public ModuleBuilder DefineDynamicModule (string name, bool emitSymbolInfo)
91 return DefineDynamicModule (name, name, emitSymbolInfo);
94 public ModuleBuilder DefineDynamicModule(string name, string fileName)
96 return DefineDynamicModule (name, fileName, false);
99 public ModuleBuilder DefineDynamicModule (string name, string fileName,
102 ModuleBuilder r = new ModuleBuilder (this, name, fileName, emitSymbolInfo);
104 if (modules != null) {
105 ModuleBuilder[] new_modules = new ModuleBuilder [modules.Length + 1];
106 System.Array.Copy(modules, new_modules, modules.Length);
107 new_modules [modules.Length] = r;
108 modules = new_modules;
110 modules = new ModuleBuilder [1];
116 public IResourceWriter DefineResource (string name, string description, string fileName)
121 public IResourceWriter DefineResource (string name, string description,
122 string fileName, ResourceAttributes attribute)
127 public void DefineUnmanagedResource (byte[] resource)
131 public void DefineUnmanagedResource (string resourceFileName)
135 public void DefineVersionInfoResource ()
139 public void DefineVersionInfoResource (string product, string productVersion,
140 string company, string copyright, string trademark)
144 public ModuleBuilder GetDynamicModule (string name)
149 public override Type[] GetExportedTypes ()
154 public override FileStream GetFile (string name)
159 /*public virtual FileStream[] GetFiles() {
162 public override FileStream[] GetFiles(bool getResourceModules) {
166 /*public virtual ManifestResourceInfo GetManifestResourceInfo(string resourceName)
170 public virtual string[] GetManifestResourceNames() {
173 public virtual Stream GetManifestResourceStream(string name) {
176 public virtual Stream GetManifestResourceStream(Type type, string name) {
180 [MethodImplAttribute(MethodImplOptions.InternalCall)]
181 private static extern int getUSIndex (AssemblyBuilder ab, string str);
183 [MethodImplAttribute(MethodImplOptions.InternalCall)]
184 private static extern int getToken (AssemblyBuilder ab, MemberInfo member);
186 internal int GetToken (string str) {
187 return getUSIndex (this, str);
190 internal int GetToken (MemberInfo member) {
191 return getToken (this, member);
194 [MethodImplAttribute(MethodImplOptions.InternalCall)]
195 private static extern int getDataChunk (AssemblyBuilder ab, byte[] buf, int offset);
197 public void Save (string assemblyFileName)
199 byte[] buf = new byte [65536];
204 assemblyFileName = String.Format ("{0}{1}{2}", dir, System.IO.Path.DirectorySeparatorChar, assemblyFileName);
207 file = new FileStream (assemblyFileName, FileMode.Create, FileAccess.Write);
210 while ((count = getDataChunk (this, buf, offset)) != 0) {
211 file.Write (buf, 0, count);
217 public void SetEntryPoint (MethodInfo entryMethod)
219 entry_point = entryMethod;
222 public void SetEntryPoint (MethodInfo entryMethod, PEFileKinds fileKind)
224 entry_point = entryMethod;
227 public void SetCustomAttribute( CustomAttributeBuilder customBuilder) {
228 if (cattrs != null) {
229 CustomAttributeBuilder[] new_array = new CustomAttributeBuilder [cattrs.Length + 1];
230 cattrs.CopyTo (new_array, 0);
231 new_array [cattrs.Length] = customBuilder;
234 cattrs = new CustomAttributeBuilder [1];
235 cattrs [0] = customBuilder;
238 public void SetCustomAttribute( ConstructorInfo con, byte[] binaryAttribute) {
239 SetCustomAttribute (new CustomAttributeBuilder (con, binaryAttribute));