示例#1
0
        /// <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);
                }
            }
        }
示例#2
0
        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;
            }
        }