ID - C style alphanumeric identifier (e.g., Hello_There2)
DOTTEDNAME - Sequence of dot-separated IDs (e.g., System.Object)
QSTRING - C style quoted string (e.g., "hi ")
SQSTRING - Single-quoted string(e.g., 'hi')
INT32 - C style 32-bit integer (e.g., 235, 03423, 0x34FFF)
INT64 - C style 64-bit integer (e.g., -2353453636235234, 0x34FFFFFFFFFF)
FLOAT64 - C style floating point number (e.g., -0.2323, 354.3423, 3435.34E-5)
INSTR_* - IL instructions of a particular class (see opcode.def)
HEXBYTE - 1- or 2-digit hexadecimal number (e.g., A2, F0)
ILAsm keywords are in bold (e.g., .class, valuetype, marshal)
Comments are enclosed in pairs /* */ (e.g., /* This is a comment */)
Auxiliary Lexical Tokens
TYPEDEF_T - Aliased class (TypeDef or TypeRef)
TYPEDEF_M - Aliased method
TYPEDEF_F - Aliased field
TYPEDEF_TS - Aliased type specification (TypeSpec)
TYPEDEF_MR - Aliased field/method reference (MemberRef)
TYPEDEF_CA – Aliased custom attribute
compQstring::= QSTRING |compQstring+ QSTRING
int32::= INT64
int64::= INT64
float64::= FLOAT64 | float32(int32) | float64(int64)
bytes::= /* EMPTY */ |hexbytes
hexbytes::= HEXBYTE |hexbytesHEXBYTE
truefalse::= true| false
mdtoken::= mdtoken(int32)
id::= ID | SQSTRING
dottedName::=id| DOTTEDNAME |dottedName.dottedName
slashedName::=dottedName|slashedName/dottedName
className::= [dottedName]slashedName
| [mdtoken]slashedName
| [ * ]slashedName
| [ .moduledottedName]slashedName
|slashedName
|mdtoken
| TYPEDEF_T
| .this
| .base
| .nester
classNameSeq::= /* EMPTY */ |className classNameSeq
PROGRAM ::=decls
decls::= /* EMPTY */ |decls decl
decl::=moduleParamDecl
|manifestDecl
|classHead{classDecls}
| .namespacedottedName{decls} /* obsolete */
|methodHead methodDecls}
|fieldDecl
|dataDecl
|extSourceSpec
|secDecl
|customAttrDecl
|languageDecl
|typedefDecl
|compControl
Compilation Control Directives
compControl::= #definedottedName
| #definedottedNameQSTRING
| #undefdottedName
| #ifdefdottedName
| #ifndefdottedName
| #else
| #endif
| #include QSTRING
| ;
moduleParamDecl::= .subsystemint32
| .corflagsint32
| .file alignmentint32
| .imagebaseint64
| .stackreserveint64
| .typelist{classNameSeq}
| .mscorlib
|vtableDecl/* deprecated, usevtfixupDeclinstead */
|vtfixupDecl
V-Table Fixup Table Declaration
vtfixupDecl::= .vtfixup[int32]vtfixupAttratid
vtfixupAttr::= /* EMPTY */
|vtfixupAttrint32
|vtfixupAttrint64
|vtfixupAttrfromunmanaged
|vtfixupAttrcallmostderived /* unused */
|vtfixupAttrretainappdomain /* unused */
vtableDecl::= .vtable= (bytes) /* deprecated, use .vtfixup instead */
manifestDecl::= .module
| .moduledottedName
| .module externdottedName
|assemblyHead{assemblyDecls}
|assemblyRefHead{assemblyRefDecls}
|fileDecl
|exptypeHead{exptypeDecls}
|manifestResHead{manifestResDecls}
|moduleHead
assemblyHead::= .assemblyasmAttr dottedName
asmAttr::= /* EMPTY */
|asmAttrretargetable
|asmAttrlegacy library/* for backward compatibility only */
|asmAttrcil
|asmAttrx86
|asmAttria64
|asmAttramd64
|asmAttrarm/* introduced in v4.5 */
|asmAttrwindowsruntime/* introduced in v4.5 */
assemblyDecls::= /* EMPTY */
|assemblyDecls assemblyDecl
assemblyDecl::= .hash algorithmint32
|secDecl
|asmOrRefDecl
asmOrRefDecl::= .publickey= (bytes)
| .verintOrWildcard:intOrWildcard:intOrWildcard:intOrWildcard
| .localecompQstring
| .locale= (bytes)
|customAttrDecl
|compControl
intOrWildcard::=int32| *
assemblyRefHead::= .assembly externasmAttr dottedName
| .assembly externasmAttr dottedNameasdottedName
assemblyRefDecls::= /* EMPTY */
|assemblyRefDecls assemblyRefDecl
assemblyRefDecl::= .hash= (bytes)
|asmOrRefDecl
| .publickeytoken= (bytes)
| auto
fileDecl::= .filefileAttr dottedName fileEntry.hash= (bytes)fileEntry
| .filefileAttr dottedName fileEntry
fileAttr::= /* EMPTY */
|fileAttrnometadata
fileEntry::= /* EMPTY */
| .entrypoint
exptypeHead::= .class externexptAttr dottedName
exptAttr::= /* EMPTY */
|exptAttrprivate
|exptAttrpublic
|exptAttrforwarder
|exptAttrnested public
|exptAttrnested private
|exptAttrnested family
|exptAttrnested assembly
|exptAttrnested famandassem
|exptAttrnested famorassem
exptypeDecls::= /* EMPTY */
|exptypeDecls exptypeDecl
exptypeDecl::= .filedottedName
| .class externslashedName
| .assembly externdottedName
| mdtoken(int32)
| .classint32
|customAttrDecl
|compControl
manifestResHead::= .mresourcemanresAttr dottedName
| .mresourcemanresAttr dottedNameasdottedName
manresAttr::= /* EMPTY */
|manresAttrpublic
|manresAttrprivate
manifestResDecls::= /* EMPTY */
|manifestResDecls manifestResDecl
manifestResDecl::= .filedottedNameatint32
| .assembly externdottedName
|customAttrDecl
|compControl
type::= classclassName
| value classclassName
| valuetypeclassName
|type[ ]
|type[bounds]
|type&
|type*
|typepinned
|typemodreq(typeSpec)
|typemodopt(typeSpec)
| methodcallConv type* (sigArgs0)
|type<tyArgs>
| ! !int32
| !int32
| ! !dottedName
| !dottedName
| object
| typedref
| void
| native int
| native unsigned int
| native uint
| native float
|simpleType
| ...type
simpleType::= char
| string
| bool
|intType
| float32
| float64
| TYPEDEF_TS
intType::= int8
| int16
| int32
| int64
| unsigned int8
| unsigned int16
| unsigned int32
| unsigned int64
| uint8
| uint16
| uint32
| uint64
bounds::=bound|bounds,bound
bound::= /* EMPTY */
| ...
|int32
|int32...int32
|int32...
typeSpec::=className
| [dottedName]
| [ .moduledottedName]
|type
Native Types in Marshaling Signatures
nativeType::= /* EMPTY */
| custom(compQstring,compQstring,compQstring,compQstring)
| custom(compQstring,compQstring)
| fixed sysstring[int32]
| fixed array[int32]nativeType
| variant
| currency
| syschar
| void
| bool
|intType
| float32
| float64
| error
|nativeType*
|nativeType[ ]
|nativeType[int32]
|nativeType[int32+int32]
|nativeType[ +int32]
| decimal
| date
| bstr
| lpstr
| lpwstr
| lptstr
| objectref
| iunknown iidParamIndex
| idispatchiidParamIndex
| struct
| interfaceiidParamIndex
| safearrayvariantType
| safearrayvariantType,compQstring
| int
| unsigned int
| uint
| nested struct
| byvalstr
| ansi bstr
| tbstr
| variant bool
| method
| as any
| lpstruct
| TYPEDEF_TS
iidParamIndex::= /* EMPTY */ | (iidparam=int32)
variantType::= /* EMPTY */
| null
| variant
| currency
| void
| bool
|intType
| float32
| float64
| *
|variantType[ ]
|variantTypevector
|variantType&
| decimal
| date
| bstr
| lpstr
| lpwstr
| iunknown
| idispatch
| safearray
| int
| unsigned int
| uint
| error
| hresult
| carray
| userdefined
| record
| filetime
| blob
| stream
| storage
| streamed_object
| stored_object
| blob_object
| cf
| clsid
methodRef::=callConv type typeSpec::methodName tyArgs0(sigArgs0)
|callConv type methodName tyArgs0(sigArgs0)
|mdtoken
| TYPEDEF_M
| TYPEDEF_MR
genMethodRef::= methodcallConv type typeSpec::methodName genArity(sigArgs0)
callConv::= instancecallConv
| explicitcallConv
|callKind
| callconv(int32)
callKind::= /* EMPTY */
| default
| vararg
| unmanaged cdecl
| unmanaged stdcall
| unmanaged thiscall
| unmanaged fastcall
methodName::= .ctor
| .cctor
|dottedName
genArity::= /* EMPTY */
| < [int32] >
tyArgs0::= /* EMPTY */ | <tyArgs>
tyArgs::= /* EMPTY */ |tyArgsNotEmpty
tyArgsNotEmpty:=type|tyArgsNotEmpty,type
sigArgs0::= /* EMPTY */ |sigArgsNotEmpty
sigArgsNotEmpty::=sigArg|sigArgsNotEmpty,sigArg
sigArg::= ... /* ellipsis */
|paramAttr type marshalClause
|paramAttr type marshalClauseid
fieldRef::=type typeSpec::dottedName
|type dottedName
| TYPEDEF_F
| TYPEDEF_MR
|mdtoken
memberRef::= methodmethodRef
| fieldfieldRef
classHead::= classHeadBegin extendsClause implClause
classHeadBegin::= .classclassAttr dottedName typarsClause
classAttr::= /* EMPTY */
|classAttrpublic
|classAttrprivate
|classAttrvalue
|classAttrenum
|classAttrinterface
|classAttrsealed
|classAttrabstract
|classAttrauto
|classAttrsequential
|classAttrexplicit
|classAttransi
|classAttrunicode
|classAttrautochar
|classAttrimport
|classAttrserializable
|classAttrnested public
|classAttrnested private
|classAttrnested family
|classAttrnested assembly
|classAttrnested famandassem
|classAttrnested famorassem
|classAttrbeforefieldinit
|classAttrspecialname
|classAttrrtspecialname
|classAttrwindowsruntime/* introduced in v4.5 */
|classAttrflags(int32)
extendsClause::= /* EMPTY */
| extendstypeSpec
implClause::= /* EMPTY */
| implementsimplList
implList::=implList,typeSpec
|typeSpec
Generic Type Parameters Declaration
typeList::= /* EMPTY */
|typeListNotEmpty
typeListNotEmpty::=typeSpec
|typeListNotEmpty,typeSpec
typarsClause::= /* EMPTY */
| <typars>
typarAttrib::= + | - | class| valuetype| .ctor
typarAttribs::= /* EMPTY */
|typarAttrib typarAttribs
typars::=typarAttribs tyBound dottedName typarsRest
|typarAttribs dottedName typarsRest
tyBound::= (typeList)
typarsRest::= /* EMPTY */
| ,typars
classDecls::= /* EMPTY */
|classDecls classDecl
classDecl::=methodHead methodDecls}
|classHead{classDecls}
|eventHead{eventDecls}
|propHead{propDecls}
|fieldDecl
|dataDecl
|secDecl
|extSourceSpec
|customAttrDecl
| .sizeint32
| .packint32
| .overridetypeSpec::methodNamewith
callConv type typeSpec::methodName(sigArgs0)
| .overridegenMethodRefwithgenMethodRef
|languageDecl
|compControl
| .param type[int32]
| .param typedottedName
fieldDecl::=.fieldrepeatOpt fieldAttr marshalClause type dottedName atOpt initOpt
fieldAttr::= /* EMPTY */
|fieldAttrstatic
|fieldAttrpublic
|fieldAttrprivate
|fieldAttrfamily
|fieldAttrassembly
|fieldAttrfamandassem
|fieldAttrfamorassem
|fieldAttrprivatescope
|fieldAttrinitonly
|fieldAttrrtspecialname
|fieldAttrspecialname
|fieldAttrliteral
|fieldAttrnotserialized
|fieldAttrflags(int32)
marshalClause::= /* EMPTY */
| marshal(nativeType)
atOpt::= /* EMPTY */
| atid
initOpt::= /* EMPTY */
| =fieldInit
repeatOpt::= /* EMPTY */
| [int32]
methodHead::=.methodmethAttr callConv paramAttr type marshalClause
methodName typarsClause(sigArgs0)implAttr{
methAttr::= /* EMPTY */
|methAttrstatic
|methAttrpublic
|methAttrprivate
|methAttrfamily
|methAttrassembly
|methAttrfamandassem
|methAttrfamorassem
|methAttrprivatescope /* default */
|methAttrfinal
|methAttrvirtual
|methAttrstrict
|methAttrabstract
|methAttrhidebysig
|methAttrnewslot
|methAttrspecialname
|methAttrrtspecialname
|methAttrunmanagedexp /* unused */
|methAttrreqsecobj
|methAttrflags(int32)
|methAttrpinvokeimpl(compQstringascompQstring pinvAttr)
|methAttrpinvokeimpl(compQstring pinvAttr)
|methAttrpinvokeimpl(pinvAttr)
pinvAttr::= /* EMPTY */
|pinvAttrnomangle
|pinvAttransi
|pinvAttrunicode
|pinvAttrautochar
|pinvAttrlasterr
|pinvAttrwinapi
|pinvAttrcdecl
|pinvAttrstdcall
|pinvAttrthiscall
|pinvAttrfastcall
|pinvAttrbestfit: on
|pinvAttrbestfit: off
|pinvAttrcharmaperror: on
|pinvAttrcharmaperror: off
|pinvAttrflags(int32)
paramAttr::= /* EMPTY */
|paramAttr[ in]
|paramAttr[ out]
|paramAttr[ opt]
|paramAttr[int32]
implAttr::= /* EMPTY */
|implAttrnative
|implAttrcil /* default */
|implAttroptil /* unused */
|implAttrmanaged /* default */
|implAttrunmanaged
|implAttrforwardref
|implAttrpreservesig
|implAttrruntime
|implAttrinternalcall
|implAttrsynchronized
|implAttrnoinlining
|implAttrflags(int32)
methodDecls::= /* EMPTY */
|methodDecls methodDecl
methodDecl::= .emitbyteint32
|mehBlock
| .maxstackint32
| .locals(sigArgs0)
| .locals init(sigArgs0)
| .entrypoint
| .zeroinit /* deprecated, use .locals init*/
|dataDecl
|instr
|id: /* label */
|secDecl
|extSourceSpec
|languageDecl
|customAttrDecl
|compControl
| .export[int32]
| .export[int32] asid
| .vtentryint32:int32
| .overridetypeSpec::methodName
| .overridegenMethodRef
|scopeBlock
| .param type[int32]
| .param typedottedName
| .param[int32]initOpt
scopeBlock::= {methodDecls}
languageDecl::= .language SQSTRING
| .language SQSTRING , SQSTRING
| .language SQSTRING , SQSTRING , SQSTRING
extSourceSpec::=esHead int32SQSTRING
|esHead int32
|esHead int32:int32SQSTRING
|esHead int32:int32
|esHead int32:int32,int32SQSTRING
|esHead int32:int32,int32
|esHead int32,int32:int32SQSTRING
|esHead int32,int32:int32
|esHead int32,int32:int32,int32SQSTRING
|esHead int32,int32:int32,int32
|esHead int32QSTRING
esHead::= .line| #line
Managed Exception Handling Directives
mehBlock::= tryBlock mehClauses
tryBlock::= .tryscopeBlock
| .tryidtoid
| .tryint32toint32
mehClauses::=mehClause mehClauses
|mehClause
mehClause::= catchtypeSpec handlerBlock
|filterClause handlerBlock
| finallyhandlerBlock
| faulthandlerBlock
filterClause::= filterscopeBlock
| filterid
| filterint32
handlerBlock::=scopeBlock
| handleridtoid
| handlerint32toint32
instr::= INSTR_NONE /* nop, add, ldc.i4.1, ldnull, ldarg.0, and so on */
| INSTR_VARint32/* ldarg, ldarga, starg, ldloc, ldloca, stloc*/
| INSTR_VARid
| INSTR_Iint32 /* ldc.i4*/
| INSTR_I8int64/* ldc.i8*/
| INSTR_Rfloat64/* ldc.r4, ldc.r8*/
| INSTR_Rint64
| INSTR_R (bytes)
| INSTR_BRTARGETint32/* br, beq, ble, brtrue, etc. */
| INSTR_BRTARGETid
| INSTR_METHODmethodRef/* call, callvirt, jmp, ldftn, ldvirtftn, newobj*/
| INSTR_FIELDfieldRef /* ldfld, stfld, ldflda, ldsflda, stfld, stsfld*/
| INSTR_TYPEtypeSpec /* ldobj, stobj, box, unbox, newarr, etc. */
| INSTR_STRINGcompQstring /* ldstr*/
| INSTR_STRING ansi(compQstring)
| INSTR_STRING bytearray= (bytes)
| INSTR_SIGcallConv type(sigArgs0) /* calli*/
| INSTR_TOKownerType/* ldtoken*/
| INSTR_SWITCH (labels)
labels::= /* EMPTY */
|id,labels
|int32,labels
|id
|int32
eventHead::=.eventeventAttr typeSpec dottedName
| .eventeventAttr dottedName
eventAttr::= /* EMPTY */
|eventAttrrtspecialname
|eventAttrspecialname
eventDecls::= /* EMPTY */
|eventDecls eventDecl
eventDecl::= .addonmethodRef
| .removeonmethodRef
| .firemethodRef
| .othermethodRef
|extSourceSpec
|customAttrDecl
|languageDecl
|compControl
propHead::=.propertypropAttr callConv type dottedName ( sigArgs0 ) initOpt
propAttr::= /* EMPTY */
|propAttrrtspecialname
|propAttrspecialname
propDecls::= /* EMPTY */
|propDecls propDecl
propDecl::= .setmethodRef
| .getmethodRef
| .othermethodRef
|extSourceSpec
|customAttrDecl
|languageDecl
|compControl
/* Default values declaration for fields, properties, parameters
and verbal form of Custom Attribute blob description */
/* Field/property/parameter initialization */
fieldInit::=fieldSerInit
|compQstring
| nullref
fieldSerInit::= float32(float64)
| float64(float64)
| float32(int32)
| float64(int64)
| int64(int64)
| int32(int32)
| int16(int32)
| int8(int32)
| unsigned int64(int64)
| unsigned int32(int32)
| unsigned int16(int32)
| unsigned int8(int32)
| uint64(int64)
| uint32(int32)
| uint16(int32)
| uint8(int32)
| char(int32)
| bool(truefalse)
| bytearray(bytes)
/* Values for verbal form of Custom Attribute blob description */
serInit::=fieldSerInit
| string(nullref)
| string( SQSTRING )
| type(class SQSTRING ) /* class name specified in Reflection notation */
| type(className) /* class name specified in ILAsm notation */
| type(nullref)
| object(serInit)
| float32[int32] (f32seq)
| float64[int32] (f64seq)
| int64[int32] (i64seq)
| int32[int32] (i32seq)
| int16[int32] (i16seq)
| int8[int32] (i8seq)
| uint64[int32] (i64seq)
| uint32[int32] (i32seq)
| uint16[int32] (i16seq)
| uint8[int32] (i8seq)
| unsigned int64[int32] (i64seq)
| unsigned int32[int32] (i32seq)
| unsigned int16[int32] (i16seq)
| unsigned int8[int32] (i8seq)
| char[int32] (i16seq)
| bool[int32] (boolSeq)
| string[int32] (sqstringSeq)
| type[int32] (classSeq)
| object[int32] (objSeq)
f32seq::= /* EMPTY */
|f32seq float64
|f32seq int32
f64seq::= /* EMPTY */
|f64seq float64
|f64seq int64
i64seq::= /* EMPTY */ |i64seq int64
i32seq::= /* EMPTY */ |i32seq int32
i16seq::= /* EMPTY */ |i16seq int32
i8seq ::= /* EMPTY */ |i8seq int32
boolSeq::= /* EMPTY */ |boolSeq truefalse
sqstringSeq::= /* EMPTY */
|sqstringSeqnullref
|sqstringSeqSQSTRING
classSeq::= /* EMPTY */
|classSeqnullref
|classSeqclass SQSTRING /* class name specified in Reflection notation */
|classSeq className/* class name specified in ILAsm notation */
objSeq::= /* EMPTY */ |objSeq serInit
customAttrDecl::= customDescr
|customDescrWithOwner
| TYPEDEF_CA
customDescr::= .customcustomType
| .customcustomType=compQstring
| .customcustomType= {customBlobDescr}
| .customcustomType= (bytes)
customDescrWithOwner::= .custom(ownerType)customType
| .custom(ownerType)customType=compQstring
| .custom(ownerType)customType= {customBlobDescr}
| .custom(ownerType)customType= (bytes)
customType::=methodRef/* method must be .ctor*/
ownerType::= typeSpec | memberRef
Verbal Description of Custom Attribute Initialization Blob
customBlobDescr::= customBlobArgs customBlobNVPairs
customBlobArgs::= /* EMPTY */
|customBlobArgs serInit
|customBlobArgs compControl
customBlobNVPairs::= /* EMPTY */
|customBlobNVPairs fieldOrProp serializType dottedName=serInit
|customBlobNVPairs compControl
fieldOrProp::= field| property
serializType::=simpleType
| type
| object
| enum class SQSTRING /* class specified in Reflection notation */
| enumclassName/* class name specified in ILAsm notation */
|serializType[ ]
secDecl::= .permissionsecAction typeSpec ( nameValPairs )
| .permissionsecAction typeSpec= {customBlobDescr}
| .permissionsecAction typeSpec
| .permissionsetsecAction= (bytes)
| .permissionsetsecActionbytearray(bytes)
| .permissionsetsecAction compQstring
| .permissionsetsecAction= {secAttrSetBlob}
secAttrSetBlob::= /* EMPTY */
|secAttrBlob
|secAttrBlob,secAttrSetBlob
secAttrBlob::=typeSpec= {customBlobNVPairs}
| classSQSTRING= {customBlobNVPairs}
nameValPairs::=nameValPair
|nameValPair,nameValPairs
nameValPair::=compQstring=caValue
caValue::=truefalse
|int32
| int32(int32)
|compQstring
|className(int8:int32)
|className(int16:int32)
|className(int32:int32)
|className(int32)
secAction::= request
| demand
| assert
| deny/* not supported in v4.0 or later */
| permitonly
| linkcheck
| inheritcheck
| reqmin/* not supported in v4.0 or later */
| reqopt/* not supported in v4.0 or later */
| reqrefuse/* not supported in v4.0 or later */
| prejitgrant
| prejitdeny
| noncasdemand
| noncaslinkdemand
| noncasinheritance
Aliasing of Types, Methods, Fields, and Custom Attributes
typedefDecl::= .typedeftypeasdottedName /* TYPEDEF_TS */
| .typedefclassNameasdottedName /* TYPEDEF_T */
| .typedefmemberRefasdottedName /* TYPEDEF_M, _F, _MR */
| .typedefcustomDescrasdottedName /* TYPEDEF_CA */
| .typedefcustomDescrWithOwnerasdottedName/* TYPEDEF_CA */
dataDecl::= ddHead ddBody
ddHead::= .datasection id=
| .datasection
section::= /* EMPTY */ /* defaults to .sdata section */
| tls /* .tls section */
| cil /* .text section */
ddBody::= {ddItemList}
|ddItem
ddItemList::=ddItem,ddItemList
|ddItem
ddItem::= char* (compQstring)
| & (id) /* data is pointer to another data */
| bytearray(bytes)
| float32(float64)ddItemCount
| float64(float64)ddItemCount
| int64(int64)ddItemCount
| int32(int32)ddItemCount
| int16(int32)ddItemCount
| int8(int32)ddItemCount
| float32ddItemCount
| float64ddItemCount
| int64ddItemCount
| int32ddItemCount
| int16ddItemCount
| int8ddItemCount
ddItemCount::= /* EMPTY */ /* defaults to 1 */
| [int32]
18.216.83.240