Added support for resolving MissingTypes in AssemblyBuilder.

This commit is contained in:
jfrijters 2011-01-18 16:44:39 +00:00
Родитель 8f09a6ae54
Коммит ff28c44961
4 изменённых файлов: 37 добавлений и 3 удалений

Просмотреть файл

@ -64,6 +64,7 @@ namespace IKVM.Reflection.Emit
private readonly List<CustomAttributeBuilder> customAttributes = new List<CustomAttributeBuilder>();
private readonly List<CustomAttributeBuilder> declarativeSecurity = new List<CustomAttributeBuilder>();
private readonly List<Type> typeForwarders = new List<Type>();
private Dictionary<string, Type> missingTypes;
private struct ResourceFile
{
@ -528,6 +529,35 @@ namespace IKVM.Reflection.Emit
return null;
}
internal override Type ResolveType(string ns, string name)
{
return base.ResolveType(ns, name) ?? GetMissingType(this.ManifestModule, null, ns, name);
}
internal Type GetMissingType(Module module, Type declaringType, string ns, string name)
{
if (missingTypes == null)
{
return null;
}
Type mt = new MissingType(module, declaringType, ns, name);
Type type;
if (!missingTypes.TryGetValue(mt.FullName, out type))
{
missingTypes.Add(mt.FullName, mt);
type = mt;
}
return type;
}
public void __EnableMissingTypeResolution()
{
if (missingTypes == null)
{
missingTypes = new Dictionary<string, Type>();
}
}
public override string ImageRuntimeVersion
{
get { return imageRuntimeVersion; }

Просмотреть файл

@ -1037,6 +1037,11 @@ namespace IKVM.Reflection.Emit
{
get { return token == 0x02000001; }
}
internal override Type ResolveNestedType(string ns, string name)
{
return base.ResolveNestedType(ns, name) ?? ((AssemblyBuilder)ModuleBuilder.Assembly).GetMissingType(this.Module, this, ns, name);
}
}
sealed class BakedType : Type

Просмотреть файл

@ -350,13 +350,13 @@ namespace IKVM.Reflection
sealed class MissingType : Type
{
private readonly MissingModule module;
private readonly Module module;
private readonly Type declaringType;
private readonly string ns;
private readonly string name;
private Dictionary<string, Type> types;
internal MissingType(MissingModule module, Type declaringType, string ns, string name)
internal MissingType(Module module, Type declaringType, string ns, string name)
{
this.module = module;
this.declaringType = declaringType;

Просмотреть файл

@ -773,7 +773,6 @@ namespace IKVM.Reflection
// unlike the public API, this takes the namespace and name into account
internal Type GetNestedTypeCorrectly(string name)
{
CheckBaked();
foreach (Type type in __GetDeclaredTypes())
{
if (MatchTypeNames(type.__Namespace, type.__Name, name))