Skip to content

4. Extended CLI MetaData Reader

DKorablin edited this page Jan 2, 2024 · 1 revision

Extended CLI reader was added to simplify read MetaData tables to be more similar to System.Type instance. First of all you will need to choose the type you want to analyze using TypeDef row:

if(file.Header.IsValid == false) return;

StreamTables tables = file.ComDescriptor?.MetaData?.StreamTables;
if(tables == null) return;

TypeDefRow typeDef in tables.TypeDef[0];//As an example we will try to map first type from the assembly.

Next you need to use AlphaOmega.Debug.CorDirectory.Meta.Reader.TypeReader class to map TypeDef row to more convenient reader:

TypeReader reader = new TypeReader(typeDef);

After that you can enumerate all members, interfaces and attributes related to loaded type (That are defined only in the current assembly):

How to read all attributes

TypeReader reader = new TypeReader(typeDef);
foreach(AttributeReader attrReader in reader.GetAttributes())
{
	String attributeFullName = attrReader.FullName;
	// See "Basic CLI Reader" article how to read attribute details
}

How to read all methods, properties and fields

TypeReader reader = new TypeReader(typeDef);
foreach(MethodReader method in reader.GetMembers())
{
	String methodName = method.Name;
	Boolean isProperty = method.IsProperty;
	ElementType returnType = method.Return;

	foreach(MemberArgument argument in method.GetArguments())
	{
		// List of all method arguments
	}

	foreach(GenericParamRow genericParam in method.GetGenericArguments())
	{
		// List of all method generic arguments
	}

	foreach(AttributeReader attr in method.GetCustomAttributes())
	{
		// List of all custom attributes related to the method
	}
}

foreach(PropertyReader prop in  reader.GetProperties())
{
	ElementType returnType = prop.Return;
	Boolean canRead = prop.CanRead;
	Boolean canWrite = prop.CanWrite;

	MethodReader getMethod = prop.GetGetMethod();
	MethodReader setMethod = prop.GetSetMethod();
	// PropertyReader inherits MethodReader
}

foreach(FieldRow field in reader.GetFields())
{
	// This is base MetaData field row
}