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;
19 namespace System.Reflection.Emit {
21 public sealed class AssemblyBuilder : Assembly {
22 private IntPtr dynamic_assembly;
23 private MethodInfo entry_point;
24 private ModuleBuilder[] modules;
26 private int[] table_indexes;
28 internal AssemblyBuilder (AssemblyName n, AssemblyBuilderAccess access) {
32 internal int get_next_table_index (int table, bool inc) {
33 if (table_indexes == null) {
34 table_indexes = new int [64];
35 for (int i=0; i < 64; ++i)
36 table_indexes [i] = 1;
38 // Console.WriteLine ("getindex for table "+table.ToString()+" got "+table_indexes [table].ToString());
40 return table_indexes [table]++;
41 return table_indexes [table];
44 public override string CodeBase {
50 public override MethodInfo EntryPoint {
56 public override string Location {
62 public void AddResourceFile (string name, string fileName)
66 public void AddResourceFile (string name, string fileName, ResourceAttributes attribute)
70 public override ModuleBuilder DefineDynamicModule (string name)
72 return DefineDynamicModule (name, name, false);
75 public override ModuleBuilder DefineDynamicModule (string name, bool emitSymbolInfo)
77 return DefineDynamicModule (name, name, emitSymbolInfo);
80 public ModuleBuilder DefineDynamicModule(string name, string fileName)
82 return DefineDynamicModule (name, fileName, false);
85 public ModuleBuilder DefineDynamicModule (string name, string fileName,
88 ModuleBuilder r = new ModuleBuilder (this, name, fileName);
90 if (modules != null) {
91 ModuleBuilder[] new_modules = new ModuleBuilder [modules.Length + 1];
92 System.Array.Copy(modules, new_modules, modules.Length);
93 new_modules [modules.Length] = r;
94 modules = new_modules;
96 modules = new ModuleBuilder [1];
102 public IResourceWriter DefineResource (string name, string description, string fileName)
107 public IResourceWriter DefineResource (string name, string description,
108 string fileName, ResourceAttributes attribute)
113 public void DefineUnmanagedResource (byte[] resource)
117 public void DefineUnmanagedResource (string resourceFileName)
121 public void DefineVersionInfoResource ()
125 public void DefineVersionInfoResource (string product, string productVersion,
126 string company, string copyright, string trademark)
130 public ModuleBuilder GetDynamicModule (string name)
135 public override Type[] GetExportedTypes ()
140 public override FileStream GetFile (string name)
145 /*public virtual FileStream[] GetFiles() {
148 public override FileStream[] GetFiles(bool getResourceModules) {
152 /*public virtual ManifestResourceInfo GetManifestResourceInfo(string resourceName)
156 public virtual string[] GetManifestResourceNames() {
159 public virtual Stream GetManifestResourceStream(string name) {
162 public virtual Stream GetManifestResourceStream(Type type, string name) {
166 [MethodImplAttribute(MethodImplOptions.InternalCall)]
167 private static extern int getUSIndex (AssemblyBuilder ab, string str);
169 [MethodImplAttribute(MethodImplOptions.InternalCall)]
170 private static extern int getToken (AssemblyBuilder ab, MemberInfo member);
172 internal int GetToken (string str) {
173 return getUSIndex (this, str);
176 internal int GetToken (MemberInfo member) {
177 return getToken (this, member);
180 [MethodImplAttribute(MethodImplOptions.InternalCall)]
181 private static extern int getDataChunk (AssemblyBuilder ab, int type, byte[] buf);
183 public void Save (string assemblyFileName)
185 byte[] buf = new byte[8192];
189 file = new FileStream (assemblyFileName, FileMode.OpenOrCreate, FileAccess.Write);
191 count = getDataChunk (this, 0, buf);
193 file.Write (buf, 0, count);
194 count = getDataChunk (this, 1, buf); /* may be a too small buffer */
195 file.Write (buf, 0, count);
201 public void SetEntryPoint (MethodInfo entryMethod)
203 entry_point = entryMethod;
206 public void SetEntryPoint (MethodInfo entryMethod, PEFileKinds fileKind)
208 entry_point = entryMethod;