예제 #1
0
        // The only purpose of this method is to get type name and "is nested" flag, everything else is ignored by the SymWriter.
        // "td" is token returned by GetMethodProps or GetNestedClassProps
        unsafe uint IMetaDataImport.GetTypeDefProps(uint td, IntPtr stringTypeDef, uint cchTypeDef, out uint pchTypeDef, IntPtr pdwTypeDefFlags)
        {
            pchTypeDef = 0;
            if (td == 0)
            {
                return(0);
            }

            // The typeDef name should be fully qualified
            ITypeDefinition t = this.writer.GetTypeDefinition(td);
            string          typeDefName;

            if (this.lastTypeDef == td)
            {
                typeDefName = this.lastTypeDefName;
            }
            else
            {
                typeDefName = PeWriter.GetMangledName((INamedTypeReference)t);

                INamespaceTypeDefinition namespaceTypeDef;

                if ((namespaceTypeDef = t.AsNamespaceTypeDefinition(this.writer.Context)) != null)
                {
                    typeDefName = CodeAnalysis.MetadataHelpers.BuildQualifiedName(namespaceTypeDef.NamespaceName, typeDefName);
                }

                this.lastTypeDef     = td;
                this.lastTypeDefName = typeDefName;
            }

            pchTypeDef = (uint)typeDefName.Length;
            if (pchTypeDef >= cchTypeDef)
            {
                pchTypeDef = cchTypeDef - 1;
            }

            char *pointerTypeDef = (char *)stringTypeDef.ToPointer();

            for (int i = 0; i < pchTypeDef; i++)
            {
                *(pointerTypeDef + i) = typeDefName[i];
            }

            *(pointerTypeDef + pchTypeDef) = (char)0;
            uint *pointerFlags = (uint *)pdwTypeDefFlags.ToPointer();

            *pointerFlags = this.writer.GetTypeDefFlags(t.GetResolvedType(this.writer.Context));
            return(0);
        }