зеркало из https://github.com/mono/ikvm-fork.git
Added support for resolving MissingTypes in AssemblyBuilder.
This commit is contained in:
Родитель
8f09a6ae54
Коммит
ff28c44961
|
@ -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))
|
||||
|
|
Загрузка…
Ссылка в новой задаче