/// <summary> /// Constructor /// </summary> /// <param name="metaData">Metadata</param> public MDEmitter(MetaData metaData) { this.metaData = metaData; // We could get these from the metadata tables but it's just easier to get name, // declaring type etc using TypeDef and MethodDef. tokenToTypeDef = new Dictionary <uint, TypeDef>(metaData.TablesHeap.TypeDefTable.Rows); tokenToMethodDef = new Dictionary <uint, MethodDef>(metaData.TablesHeap.MethodTable.Rows); foreach (var type in metaData.Module.GetTypes()) { if (type == null) { continue; } tokenToTypeDef.Add(new MDToken(Table.TypeDef, metaData.GetRid(type)).Raw, type); foreach (var method in type.Methods) { if (method == null) { continue; } tokenToMethodDef.Add(new MDToken(Table.Method, metaData.GetRid(method)).Raw, method); } } }
unsafe void IMetaDataImport.GetMethodProps(uint mb, uint *pClass, ushort *szMethod, uint cchMethod, uint *pchMethod, uint *pdwAttr, IntPtr *ppvSigBlob, uint *pcbSigBlob, uint *pulCodeRVA, uint *pdwImplFlags) { if (mb >> 24 != 0x06) { throw new ArgumentException(); } var method = tokenToMethodDef[mb]; var row = metaData.TablesHeap.MethodTable[mb & 0x00FFFFFF]; if (pClass != null) { *pClass = new MDToken(Table.TypeDef, metaData.GetRid(method.DeclaringType)).Raw; } if (pdwAttr != null) { *pdwAttr = row.Flags; } if (ppvSigBlob != null) { *ppvSigBlob = IntPtr.Zero; } if (pcbSigBlob != null) { *pcbSigBlob = 0; } if (pulCodeRVA != null) { *pulCodeRVA = row.RVA; } if (pdwImplFlags != null) { *pdwImplFlags = row.ImplFlags; } var name = method.Name.String ?? string.Empty; var len = (int)Math.Min((uint)name.Length + 1, cchMethod); if (szMethod != null) { for (var i = 0; i < len - 1; i++, szMethod++) { *szMethod = name[i]; } if (len > 0) { *szMethod = 0; } } if (pchMethod != null) { *pchMethod = (uint)len; } }