using System;
using System.Diagnostics;
using System.Text;
using System.Runtime.InteropServices;
namespace AnticipatingMinds.PlatformServices.UnmanagedReflection{
[System.Security.Permissions.StrongNameIdentityPermissionAttribute(System.Security.Permissions.SecurityAction.LinkDemand,
PublicKey=
"00240000048000009400000006020000002400005253413100040000010001009D309779C258129573FC313836474C75C4CE9F4" +
"107524FA0B9A6DB2E52754459C5A8946E4CBD5B98ACDB2413C5AFD38C1DF00C9A946713E867237B47F9D9CC473D4A853EACBEAB" +
"799EC0A271B468D4B6D52301A414A7772F05FEBD2BA7D0A2835F0D45E401C3C37F9E7B991D29F07DA88E20BB3839A34A2739AB6" +
"56B5204C8BC")]
public class TypeInfo
{
public TypeInfo(AssemblyInfo assemblyInfo, uint typeToken)
{
this.assemblyInfo = assemblyInfo;
this.typeToken = typeToken;
if((typeToken & (uint)CorTokenType.mdtTypeDef) != 0)
{
int typeNameLength = 0;
uint attributes = 0;
uint baseTypeToken = 0;
assemblyInfo.MetadataImport.GetTypeDefProps(typeToken,null,0,out typeNameLength,out attributes,out baseTypeToken);
StringBuilder typeNameBuilder = new StringBuilder(typeNameLength + 1);
assemblyInfo.MetadataImport.GetTypeDefProps(typeToken,typeNameBuilder,typeNameBuilder.Capacity+1,out typeNameLength,out attributes,out baseTypeToken);
corAttributes = (System.Reflection.TypeAttributes) attributes;
fullName = typeNameBuilder.ToString();
baseType = assemblyInfo.GetTypeFromToken(baseTypeToken);
//For the nested classes name must be built separatly
System.Reflection.TypeAttributes typeVisibility = corAttributes & System.Reflection.TypeAttributes.VisibilityMask;
if((typeVisibility == System.Reflection.TypeAttributes.NestedAssembly) ||
(typeVisibility == System.Reflection.TypeAttributes.NestedFamANDAssem) ||
(typeVisibility == System.Reflection.TypeAttributes.NestedFamily) ||
(typeVisibility == System.Reflection.TypeAttributes.NestedFamORAssem) ||
(typeVisibility == System.Reflection.TypeAttributes.NestedPrivate) ||
(typeVisibility == System.Reflection.TypeAttributes.NestedPublic))
{
uint enclosedTypeToken = 0;
try
{
assemblyInfo.MetadataImport.GetNestedClassProps(typeToken,out enclosedTypeToken);
if(enclosedTypeToken != 0)
{
TypeInfo enclosedTypeInfo = assemblyInfo.GetTypeFromToken(enclosedTypeToken);
if(enclosedTypeInfo != null && enclosedTypeInfo.FullName != null && enclosedTypeInfo.FullName.Length != 0)
fullName = enclosedTypeInfo.FullName + "." + fullName;
}
}
catch(System.Runtime.InteropServices.COMException)
{
//Sometimes record not found can appear here - nothing terribly bad
}
}
uint hEnum = 0;
int enumCount = 0;
assemblyInfo.MetadataImport.EnumInterfaceImpls(ref hEnum,typeToken,null,0,out enumCount);
assemblyInfo.MetadataImport.CountEnum(hEnum,out enumCount);
uint[] interfaceImplTokens = new uint[enumCount];
implementedInterfaces = new TypeInfo[enumCount];
assemblyInfo.MetadataImport.EnumInterfaceImpls(ref hEnum,typeToken,interfaceImplTokens,interfaceImplTokens.Length,out enumCount);
for(int i = 0; i < enumCount; i++)
{
uint uintTemp;
uint interfaceDefToken;
assemblyInfo.MetadataImport.GetInterfaceImplProps(interfaceImplTokens[i],out uintTemp,out interfaceDefToken);
implementedInterfaces[i] = assemblyInfo.GetTypeFromToken(interfaceDefToken);
}
}
if((typeToken & (uint)CorTokenType.mdtTypeRef) != 0)
{
int typeNameLength = 0;
uint resolutionScope = 0;
assemblyInfo.MetadataImport.GetTypeRefProps(typeToken,out resolutionScope,null,0,out typeNameLength);
StringBuilder typeNameBuilder = new StringBuilder(typeNameLength + 1);
assemblyInfo.MetadataImport.GetTypeRefProps(typeToken,out resolutionScope,typeNameBuilder,typeNameBuilder.Capacity+1,out typeNameLength);
fullName = typeNameBuilder.ToString();
}
}
public string FullName
{
get
{
return fullName;
}
}
public TypeInfo BaseType
{
get
{
return baseType;
}
}
public TypeInfo[] ImplementedInterfaces
{
get
{
return implementedInterfaces;
}
}
public System.Reflection.TypeAttributes CorAttributes
{
get
{
return corAttributes;
}
}
public FieldInfo[] GetDefinedFields()
{
uint hEnum = 0;
try
{
int fieldsQty = 0;
assemblyInfo.MetadataImport.EnumFields(ref hEnum,typeToken,null,0,out fieldsQty);
assemblyInfo.MetadataImport.CountEnum(hEnum,out fieldsQty);
FieldInfo[] fields = new FieldInfo[fieldsQty];
uint[] tokens = new uint[fieldsQty];
assemblyInfo.MetadataImport.EnumFields(ref hEnum,typeToken,tokens,tokens.Length,out fieldsQty);
for(int i = 0; i < tokens.Length; i++)
fields[i] = new FieldInfo(assemblyInfo,tokens[i]);
return fields;
}
finally
{
if(hEnum != 0)
assemblyInfo.MetadataImport.CloseEnum(hEnum);
}
}
public PropertyInfo[] GetDefinedProperties()
{
uint hEnum = 0;
try
{
int propertysQty = 0;
assemblyInfo.MetadataImport.EnumProperties(ref hEnum,typeToken,null,0,out propertysQty);
assemblyInfo.MetadataImport.CountEnum(hEnum,out propertysQty);
PropertyInfo[] properties = new PropertyInfo[propertysQty];
uint[] tokens = new uint[propertysQty];
assemblyInfo.MetadataImport.EnumProperties(ref hEnum,typeToken,tokens,tokens.Length,out propertysQty);
for(int i = 0; i < tokens.Length; i++)
properties[i] = new PropertyInfo(assemblyInfo,tokens[i]);
return properties;
}
finally
{
if(hEnum != 0)
assemblyInfo.MetadataImport.CloseEnum(hEnum);
}
}
public MethodInfo[] GetDefinedMethods()
{
uint hEnum = 0;
try
{
int methodsQty = 0;
assemblyInfo.MetadataImport.EnumMethods(ref hEnum,typeToken,null,0,out methodsQty);
assemblyInfo.MetadataImport.CountEnum(hEnum,out methodsQty);
MethodInfo[] methods = new MethodInfo[methodsQty];
uint[] tokens = new uint[methodsQty];
assemblyInfo.MetadataImport.EnumMethods(ref hEnum,typeToken,tokens,tokens.Length,out methodsQty);
for(int i = 0; i < tokens.Length; i++)
methods[i] = new MethodInfo(assemblyInfo,tokens[i]);
return methods;
}
finally
{
if(hEnum != 0)
assemblyInfo.MetadataImport.CloseEnum(hEnum);
}
}
public EventInfo[] GetDefinedEvents()
{
uint hEnum = 0;
try
{
int eventsQty = 0;
assemblyInfo.MetadataImport.EnumEvents(ref hEnum,typeToken,null,0,out eventsQty);
assemblyInfo.MetadataImport.CountEnum(hEnum,out eventsQty);
EventInfo[] events = new EventInfo[eventsQty];
uint[] tokens = new uint[eventsQty];
assemblyInfo.MetadataImport.EnumEvents(ref hEnum,typeToken,tokens,tokens.Length,out eventsQty);
for(int i = 0; i < tokens.Length; i++)
events[i] = new EventInfo(assemblyInfo,tokens[i]);
return events;
}
finally
{
if(hEnum != 0)
assemblyInfo.MetadataImport.CloseEnum(hEnum);
}
}
public AssemblyInfo AssemblyInfo
{
get
{
return assemblyInfo;
}
}
public uint TypeToken
{
get
{
return typeToken;
}
}
private System.Reflection.TypeAttributes corAttributes = 0;
private string fullName = null;
private TypeInfo baseType = null;
private TypeInfo[] implementedInterfaces;
private uint typeToken;
private AssemblyInfo assemblyInfo;
}
}
|