N4

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View N4 as PDF for free.

More details

  • Words: 1,493
  • Pages: 47
Introduction To .NET Metadata Matt Pietrek

Housekeeping Who is this guy? Co-founder, Mindreef LLC (www.mindreef.com) President, Wheaty Productions Inc. MSDN’s “Under the Hood” columnist

web: http://www.wheaty.net email: [email protected] Source availability

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

Metadata: The Big Picture Metadata is information stored in .NET assemblies that makes them self-describing Metadata describes: Classes (types) provided by the assembly Method and field information for classes Version information Dependencies on other assemblies and modules Security attributes required

Metadata provides the information that the .NET runtime needs to ensure type safety and security

Demo: Many Views Of Metadata

Metadata: Evolution Of A COM Concept COM IDL files describe interfaces, methods, parameters, and types in sufficient detail to marshal calls between processes COM Type Libraries are just a binary representation of IDL information Metadata is effectively type libraries on steroids Microsoft provides tools to convert between metadata and type libraries

Metadata Usage In .NET The .NET runtime relies heavily on metadata to link together calls and data references at runtime Metadata is stored in a binary format, and subject to change Microsoft provides .NET classes and classic COM interfaces to read and write metadata

The Advantage Of Metadata A shared standard of representing information between any .NET compatible language Cool benefit: Intellisense for any .NET component

Metadata is automatically generated and consumed by .NET compilers No need to create .IDL files to expose your code to others No need to mess around with .H files and import libraries

Emitting Metadata Metadata (and associated IL) can be created using the .NET runtime Compilers aren’t the only ones that get to play!

System.Reflection.Emit classes are the basis for dynamically creating code: AssemblyBuilder MethodBuilder ILGenerator Many more!

Focus in this presentation is consuming metadata

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

The Metadata Hierarchy I Assembly (e.g., mscorlib)

Collections Single Instances

Modules

Module (i.e., a DLL)

Classes Global Methods & Variables

The Metadata Hierarchy II Class (e.g., System.Object)

Methods

Fields

Method (e.g., “Foo”)

Parameters

Properties

Parameter “int Param1”

Events

Parameter “String Param2”

Assembly Metadata Name Public key Version # (major & minor) Build # Revision # Dependencies on other assemblies Locale

Class Metadata Contents Name Flags (CorTypeAttr) Visibility (Public, private, assembly, …) Layout (auto, sequential, explicit…) Type (class, interface, value type, …)

Base class (if applicable)

Method Metadata Contents Name Parent class Flags (CorMethodAttr) Visibility Static / Virtual Platform Invoke (interop to legacy code)

Implementation Flags (CorMethodImpl) IL / OptIL / Native Managed / Unmanaged implementation

Signature RVA to IL in executable file

Parameter Metadata Contents Name Parent method Order in method parameter list Attributes (CorParamAttr) In / Out Has default value Optional

Field Metadata Contents Name Parent class Attributes (CorFieldAttr) Visibility Static member

Signature (implicitly gives the size)

Property Metadata Contents Name Parent class Attributes (CorPropertyAttr) Signature (implicitly gives the size) Getter & Setter methods Default value

Event Metadata Contents Name Parent class Fired method AddOn / RemoveOn methods

Custom Attributes Custom attributes are special classes that provide additional information about a: Assembly / Module Class / Struct Method / Constructor / Property Enum Parameter / Field

Unmanaged and Reflection APIs for reading / creating custom attributes

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

About The Reflection API Full access to metadata using .NET runtime classes Assemblies, classes, methods, fields, etc… are all represented as .NET objects Layered over the unmanaged metadata interfaces

The Metadata Hierarchy As Seen By The Reflection API Assembly

ManifestResource

Module

Type

FieldInfo

PropertyInfo

MethodInfo

EventInfo

ParameterInfo

AssemblyName

Custom Attributes

Getting To The Reflection API There are a variety of entry points into the Reflection classes Assembly::LoadFrom loads a file based assembly Returns an Assembly *

For an existing .NET object, use the ::GetType method to get a Type* Type::Module property moves up the hierarchy Type::GetMethods, etc… moves down

Demo ReflectCS program

Example: Enumerating All Methods In An Assembly Use Assembly::LoadFrom to load a .NET assembly Returns an Assembly *

Assembly::GetModules returns an array of Module *’s For each Module *, call Module::GetTypes Returns an array of Type *’s

For each Type *, call Type::GetMethods Returns an array of MethodInfo *’s

For each MethodInfo *, the MethodInfo::Name property returns the method’s name

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

About The Unmanaged API Regular COM interfaces that don’t use the .NET runtime Relies heavily on “tokens” More granular than equivalent COM ITypeLib & ITypeInfo interfaces Information isn’t packed into structures

Declared in COR.H / CORHDR.H CLSIDs and IIDs defined in CORGUID.LIB

The Unmanaged Metadata Interfaces IMetaDataDispenser The “root” interface for obtaining all others Works on file or memory based metadata

IMetaDataImport The primary interface for reading class info

IMetaDataAssemblyImport IMetaDataEmit IMetaDataAssemblyEmit

Demo The Meta program

Obtaining an IMetaDataImport Interface Instance #include CoCreateInstance(

CLSID_CorMetaDataDispenser, 0, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenser, (LPVOID *)&pIMetaDataDispenser );

pIMetaDataDispenser->OpenScope( szFileName,

// Name of assembly file

ofRead, IID_IMetaDataImport,// Desired interface (LPUNKNOWN *)&pIMetaDataImport );

Important Metadata Tokens mdTypeDef: A class mdMethodDef: A code member of a class mdParamDef: A parameter to a method mdFieldDef: A data member of a class mdPropertyDef: Similar to a field, but with accessor methods mdTypeRef: A reference to a class (possibly in another assembly) mdMemberRef: A reference to a code or data member in another module mdModuleRef: A reference to another module (possibly in another assembly)

IMetaDataImport Methods Token

Enumeration Method

Get Properties method

mdTypeDef

EnumTypeDefs

GetTypeDefProps

mdMethodDef

EnumMethods

GetMethodProps

mdFieldDef

EnumFields

GetFieldProps

mdEvent

EnumEvents

GetEventProps

mdParamDef

EnumParams

GetParamProps

mdToken

EnumMembers

GetMemberProps

mdProperty

EnumProperties

GetPropertyProps

mdMemberRef

EnumMemberRefs

GetMemberRefProps

mdModuleRef

EnumModuleRefs

GetModuleRefProps

mdTypeRef

EnumTypeRefs

GetTypeRefProps

mdPermission

EnumPermissionSets

GetPermissionSetProps

mdString

EnumUserStrings

GetUserString

mdCustomValue

EnumCustomAttributes

GetCustomAttributeProps

mdInterfaceImpl

EnumInterfaceImpls

GetInterfaceImplProps

This List Is Not Complete!

Example: Enumerating All Methods In An Assembly ::EnumTypeDefs returns an array of mdTypeDefs Each representing one class

::GetTypeDefProps returns the name of the class (and other assorted info) Pass each mdTypeDef to ::EnumMethods to get an array of mdMethodDefs One per method in the class

::GetMethodProps returns the name of the method (and other assorted info)

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

Type Signatures Signatures are very similar in concept to C++ name mangling They both provide a minimal level assurance that the calling code matches up with the called code

In .NET, all methods and fields have a signature associated with them .NET signatures are a sequence of bytes that describe “type” information and other details For example, the return value and parameter types of a method

Type Signature Encoding Format for methods: Calling convention (BYTE) Number of parameters (BYTE) Return value type (Variable length) Parameter types (Variable length)

CorElementType enum in CORHDR.H defines “base” types More complex types (e.g., pointers) are built out of base types and modifiers

Type Signature Example long FirstFunction( long j, float k); becomes… 0x00

CorCallingConvention::IMAGE_CEE_CS_CALLCONV_DEFAULT

0x02

Number of parameters

0x08

Return type: CorElementType::ELEMENT_TYPE_I4

0x08

Param 1 type: CorElementType::ELEMENT_TYPE_I4

0x0C Param 2 type: CorElementType::ELEMENT_TYPE_R4

Drilling Into Metadata Tokens The DWORD tokens used by the unmanaged interfaces are easily decoded The top BYTE indicates the token type See CorTokenType in CORHDR.H

The bottom 3 BYTEs are an array index Indices start at 0, and increase monotonically through the assembly Thus, a maximum of 24MB of any particular token type in an assembly

Token Examples typedef enum CorTokenType { mdtModule

= 0x00000000,

mdtTypeRef

= 0x01000000,

mdtTypeDef

= 0x02000000,

mdtFieldDef

= 0x04000000,

mdtMethodDef

= 0x06000000,



Example tokens 0x02000034 = The 0x34th TypeDef in the assembly 0x06000159 = The 0x159th method in the assembly

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

ILDASM “Intermediate Language Disassembler” Displays IL and metadata for an assembly Displays metadata in a nice, graphical hierarchy But information is not necessarily complete

Semi-undocumented /ADV option Demo

Aisto’s Reflector A much more complete Metadata viewer than ILDasm Demo Lutz Roeder’s “Reflector” shows assembly resources, and lets you save them to a file Demo 2: Documentation.xsl from Reflector http://www.aisto.com/roeder/dotnet/

MetaInfo Written in C++ and the unmanaged API Microsoft’s most complete metadata tool Sources in <.NET SDK> .\tool developers guide\samples\metainfo

Demo

TypeRefViewer Demo Shows imported namespaces / classes / methods From the November 2001 MSDN magazine, including source

Agenda What Is Metadata? Metadata Object Overview The Reflection API The Unmanaged API Type Signatures & Tokens Tools And Demo Wrap-up And Resources

Wrap-up And Resources .NET SDK .\include\cor.h, .\include\corhdr.h .\tool developers guide\samples\metainfo .\tool developers guide\docs\ • “Assembly Metadata Unmanaged API.doc” • “Metadata Unmanaged API.doc”

Reflector program: http://www.aisto.com/roeder/dotnet/ Avoiding DLL Hell, Matt Pietrek, October 2000 MSDN magazine (Meta program) March 20001 MSDN magazine (MetaViewer) November 2001 MSDN magazine (TypeRefViewer)

Related Documents

N4
May 2020 29
N4
June 2020 26
N4
December 2019 39
N4
November 2019 43
N4 Remoroza.docx
November 2019 28
Aviso N4
November 2019 30