diff --git a/reflect/Emit/AssemblyBuilder.cs b/reflect/Emit/AssemblyBuilder.cs index 5016b01d..1614728a 100644 --- a/reflect/Emit/AssemblyBuilder.cs +++ b/reflect/Emit/AssemblyBuilder.cs @@ -60,6 +60,7 @@ namespace IKVM.Reflection.Emit private Module pseudoManifestModule; private readonly List resourceFiles = new List(); private readonly List modules = new List(); + private readonly List addedModules = new List(); private readonly List customAttributes = new List(); private readonly List declarativeSecurity = new List(); private readonly List typeForwarders = new List(); @@ -387,6 +388,12 @@ namespace IKVM.Reflection.Emit } } + foreach (Module module in addedModules) + { + int fileToken = AddFile(manifestModule, module.FullyQualifiedName, 0 /*ContainsMetaData*/); + module.ExportTypes(fileToken, manifestModule); + } + if (entryPointToken == 0 && entryPoint != null) { entryPointToken = entryPoint.MetadataToken; @@ -414,7 +421,7 @@ namespace IKVM.Reflection.Emit } FileTable.Record file = new FileTable.Record(); file.Flags = flags; - file.Name = manifestModule.Strings.Add(fileName); + file.Name = manifestModule.Strings.Add(Path.GetFileName(fileName)); file.HashValue = manifestModule.Blobs.Add(ByteBuffer.Wrap(hash.Hash)); return 0x26000000 + manifestModule.File.AddRecord(file); } @@ -477,6 +484,10 @@ namespace IKVM.Reflection.Emit { module.GetTypesImpl(list); } + foreach (Module module in addedModules) + { + module.GetTypesImpl(list); + } return list.ToArray(); } @@ -490,6 +501,14 @@ namespace IKVM.Reflection.Emit return type; } } + foreach (Module module in modules) + { + Type type = module.GetTypeImpl(typeName); + if (type != null) + { + return type; + } + } return null; } @@ -541,6 +560,13 @@ namespace IKVM.Reflection.Emit list.Add(module); } } + foreach (Module module in addedModules) + { + if (getResourceModules || !module.IsResource()) + { + list.Add(module); + } + } return list.ToArray(); } @@ -553,9 +579,23 @@ namespace IKVM.Reflection.Emit return module; } } + foreach (Module module in addedModules) + { + if (module.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)) + { + return module; + } + } return null; } + public Module __AddModule(RawModule module) + { + Module mod = module.ToModule(this); + addedModules.Add(mod); + return mod; + } + public override ManifestResourceInfo GetManifestResourceInfo(string resourceName) { throw new NotSupportedException(); diff --git a/reflect/Emit/ModuleBuilder.cs b/reflect/Emit/ModuleBuilder.cs index 07b09a4d..b3a9f64c 100644 --- a/reflect/Emit/ModuleBuilder.cs +++ b/reflect/Emit/ModuleBuilder.cs @@ -859,19 +859,24 @@ namespace IKVM.Reflection.Emit return buf; } - internal void ExportTypes(int fileToken, ModuleBuilder manifestModule) + internal override void ExportTypes(int fileToken, ModuleBuilder manifestModule) + { + manifestModule.ExportTypes(types.ToArray(), fileToken); + } + + internal void ExportTypes(Type[] types, int fileToken) { Dictionary declaringTypes = new Dictionary(); - foreach (TypeBuilder type in types) + foreach (Type type in types) { - if (type != moduleType && IsVisible(type)) + if (!type.IsModulePseudoType && IsVisible(type)) { ExportedTypeTable.Record rec = new ExportedTypeTable.Record(); rec.Flags = (int)type.Attributes; rec.TypeDefId = type.MetadataToken & 0xFFFFFF; - rec.TypeName = manifestModule.Strings.Add(TypeNameParser.Unescape(type.Name)); + rec.TypeName = this.Strings.Add(TypeNameParser.Unescape(type.Name)); string ns = type.Namespace; - rec.TypeNamespace = ns == null ? 0 : manifestModule.Strings.Add(TypeNameParser.Unescape(ns)); + rec.TypeNamespace = ns == null ? 0 : this.Strings.Add(TypeNameParser.Unescape(ns)); if (type.IsNested) { rec.Implementation = declaringTypes[type.DeclaringType]; @@ -880,7 +885,7 @@ namespace IKVM.Reflection.Emit { rec.Implementation = fileToken; } - int exportTypeToken = 0x27000000 | manifestModule.ExportedType.AddRecord(rec); + int exportTypeToken = 0x27000000 | this.ExportedType.AddRecord(rec); declaringTypes.Add(type, exportTypeToken); } } diff --git a/reflect/Module.cs b/reflect/Module.cs index fa43746e..30d7e503 100644 --- a/reflect/Module.cs +++ b/reflect/Module.cs @@ -1,5 +1,5 @@ /* - Copyright (C) 2009 Jeroen Frijters + Copyright (C) 2009-2010 Jeroen Frijters This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -31,11 +31,13 @@ namespace IKVM.Reflection public sealed class RawModule : IDisposable { private readonly ModuleReader module; + private readonly bool isManifestModule; private bool imported; internal RawModule(ModuleReader module) { this.module = module; + this.isManifestModule = module.Assembly != null; } public string Location @@ -45,7 +47,7 @@ namespace IKVM.Reflection public bool IsManifestModule { - get { return module.Assembly != null; } + get { return isManifestModule; } } private void CheckManifestModule() @@ -85,6 +87,17 @@ namespace IKVM.Reflection imported = true; return module.Assembly; } + + internal Module ToModule(Assembly assembly) + { + if (module.Assembly != null) + { + throw new InvalidOperationException(); + } + imported = true; + module.SetAssembly(assembly); + return module; + } } public abstract class Module : ICustomAttributeProvider @@ -425,6 +438,10 @@ namespace IKVM.Reflection internal virtual void Dispose() { } + + internal virtual void ExportTypes(int fileToken, IKVM.Reflection.Emit.ModuleBuilder manifestModule) + { + } } public delegate bool TypeFilter(Type m, object filterCriteria); diff --git a/reflect/Reader/ModuleReader.cs b/reflect/Reader/ModuleReader.cs index 38fb93a8..ceb99dd0 100644 --- a/reflect/Reader/ModuleReader.cs +++ b/reflect/Reader/ModuleReader.cs @@ -56,7 +56,7 @@ namespace IKVM.Reflection.Reader { internal readonly Stream stream; private readonly string location; - private readonly AssemblyReader assembly; + private Assembly assembly; private readonly PEReader peFile = new PEReader(); private readonly CliHeader cliHeader = new CliHeader(); private string imageRuntimeVersion; @@ -144,6 +144,11 @@ namespace IKVM.Reflection.Reader } } + internal void SetAssembly(Assembly assembly) + { + this.assembly = assembly; + } + private static StreamHeader[] ReadStreamHeaders(BinaryReader br, out string Version) { uint Signature = br.ReadUInt32(); @@ -984,5 +989,11 @@ namespace IKVM.Reflection.Reader { stream.Close(); } + + internal override void ExportTypes(int fileToken, IKVM.Reflection.Emit.ModuleBuilder manifestModule) + { + PopulateTypeDef(); + manifestModule.ExportTypes(typeDefs, fileToken); + } } }