コード例 #1
0
ファイル: DkmUtilities.cs プロジェクト: fjsnogueira/roslyn-1
        internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities)
        {
            ArrayBuilder <MetadataBlock> builder = null;

            foreach (AssemblyIdentity missingAssemblyIdentity in missingAssemblyIdentities)
            {
                MetadataBlock block;
                try
                {
                    uint   size;
                    IntPtr ptr;
                    ptr = getMetaDataBytesPtrFunction(missingAssemblyIdentity, out size);
                    Debug.Assert(size > 0);
                    block = GetMetadataBlock(ptr, size);
                }
                catch (Exception e) when(MetadataUtilities.IsBadOrMissingMetadataException(e, missingAssemblyIdentity.GetDisplayName()))
                {
                    continue;
                }
                if (builder == null)
                {
                    builder = ArrayBuilder <MetadataBlock> .GetInstance();
                }
                builder.Add(block);
            }
            return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree());
        }
コード例 #2
0
        internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities)
        {
            ArrayBuilder <MetadataBlock> builder = null;

            foreach (AssemblyIdentity missingAssemblyIdentity in missingAssemblyIdentities)
            {
                int            size;
                IntPtr         ptr;
                MetadataReader reader;
                if (TryGetMetadataReader(getMetaDataBytesPtrFunction, missingAssemblyIdentity, out ptr, out size, out reader))
                {
                    var moduleDef       = reader.GetModuleDefinition();
                    var moduleVersionId = reader.GetGuid(moduleDef.Mvid);
                    var generationId    = reader.GetGuid(moduleDef.GenerationId);

                    if (builder == null)
                    {
                        builder = ArrayBuilder <MetadataBlock> .GetInstance();
                    }

                    builder.Add(new MetadataBlock(moduleVersionId, generationId, ptr, size));
                }
            }
            return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree());
        }
コード例 #3
0
ファイル: DkmUtilities.cs プロジェクト: mpeyrotc/roslyn
        internal static ImmutableArray <MetadataBlock> GetMetadataBlocks(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, ImmutableArray <AssemblyIdentity> missingAssemblyIdentities)
        {
            ArrayBuilder <MetadataBlock>?builder = null;

            foreach (var missingAssemblyIdentity in missingAssemblyIdentities)
            {
                uint   size;
                IntPtr ptr;
                try
                {
                    ptr = getMetaDataBytesPtrFunction(missingAssemblyIdentity, out size);
                    Debug.Assert(size > 0);
                }
                catch (Exception e) when(DkmExceptionUtilities.IsBadOrMissingMetadataException(e))
                {
                    continue;
                }

                if (!TryGetMetadataBlock(ptr, size, out var block))
                {
                    // ignore modules with bad metadata headers
                    continue;
                }

                builder ??= ArrayBuilder <MetadataBlock> .GetInstance();

                builder.Add(block);
            }

            return(builder == null ? ImmutableArray <MetadataBlock> .Empty : builder.ToImmutableAndFree());
        }
コード例 #4
0
        /// <summary>
        /// Attempt to construct a <see cref="MetadataReader"/> instance for this module.
        /// </summary>
        /// <returns>Returns 'false' for modules with "bad" or missing metadata.</returns>
        private unsafe static bool TryGetMetadataReader(GetMetadataBytesPtrFunction getMetaDataBytesPtrFunction, AssemblyIdentity assemblyIdentity, out IntPtr ptr, out int size, out MetadataReader reader)
        {
            var assemblyName = assemblyIdentity.GetDisplayName();

            try
            {
                uint uSize;
                ptr    = getMetaDataBytesPtrFunction(assemblyIdentity, out uSize);
                size   = (int)uSize;
                reader = new MetadataReader((byte *)ptr, size);
                return(true);
            }
            catch (Exception e) when(MetadataUtilities.IsBadOrMissingMetadataException(e, assemblyName))
            {
                ptr    = IntPtr.Zero;
                size   = 0;
                reader = null;
                return(false);
            }
        }