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;
39 return table_indexes [table]++;
40 return table_indexes [table];
43 public override string CodeBase {
49 public override MethodInfo EntryPoint {
55 public override string Location {
61 public void AddResourceFile (string name, string fileName)
65 public void AddResourceFile (string name, string fileName, ResourceAttributes attribute)
69 public override ModuleBuilder DefineDynamicModule (string name)
71 return DefineDynamicModule (name, name, false);
74 public override ModuleBuilder DefineDynamicModule (string name, bool emitSymbolInfo)
76 return DefineDynamicModule (name, name, emitSymbolInfo);
79 public ModuleBuilder DefineDynamicModule(string name, string fileName)
81 return DefineDynamicModule (name, fileName, false);
84 public ModuleBuilder DefineDynamicModule (string name, string fileName,
87 ModuleBuilder r = new ModuleBuilder (this, name, fileName);
89 if (modules != null) {
90 ModuleBuilder[] new_modules = new ModuleBuilder [modules.Length + 1];
91 System.Array.Copy(modules, new_modules, modules.Length);
92 new_modules [modules.Length] = r;
93 modules = new_modules;
95 modules = new ModuleBuilder [1];
101 public IResourceWriter DefineResource (string name, string description, string fileName)
106 public IResourceWriter DefineResource (string name, string description,
107 string fileName, ResourceAttributes attribute)
112 public void DefineUnmanagedResource (byte[] resource)
116 public void DefineUnmanagedResource (string resourceFileName)
120 public void DefineVersionInfoResource ()
124 public void DefineVersionInfoResource (string product, string productVersion,
125 string company, string copyright, string trademark)
129 public ModuleBuilder GetDynamicModule (string name)
134 public override Type[] GetExportedTypes ()
139 public override FileStream GetFile (string name)
144 /*public virtual FileStream[] GetFiles() {
147 public override FileStream[] GetFiles(bool getResourceModules) {
151 /*public virtual ManifestResourceInfo GetManifestResourceInfo(string resourceName)
155 public virtual string[] GetManifestResourceNames() {
158 public virtual Stream GetManifestResourceStream(string name) {
161 public virtual Stream GetManifestResourceStream(Type type, string name) {
165 [MethodImplAttribute(MethodImplOptions.InternalCall)]
166 private static extern int getUSIndex (AssemblyBuilder ab, string str);
168 [MethodImplAttribute(MethodImplOptions.InternalCall)]
169 private static extern int getDataChunk (AssemblyBuilder ab, int type, byte[] buf);
171 public void Save (string assemblyFileName)
173 byte[] buf = new byte[8192];
177 file = new FileStream (assemblyFileName, FileMode.OpenOrCreate, FileAccess.Write);
179 count = getDataChunk (this, 0, buf);
181 file.Write (buf, 0, count);
182 count = getDataChunk (this, 1, buf); /* may be a too small buffer */
183 file.Write (buf, 0, count);
189 public void SetEntryPoint (MethodInfo entryMethod)
191 entry_point = entryMethod;
194 public void SetEntryPoint (MethodInfo entryMethod, PEFileKinds fileKind)
196 entry_point = entryMethod;