static SymbolReader CreateCore(PdbReaderContext pdbContext, Metadata metadata, DataReaderFactory pdbStream)
        {
            SymbolReader symReader = null;
            bool         error     = true;

            try {
                if (!pdbContext.HasDebugInfo)
                {
                    return(null);
                }

                if ((pdbContext.Options & PdbReaderOptions.MicrosoftComReader) != 0 && pdbStream is not null && IsWindowsPdb(pdbStream.CreateReader()))
                {
                    symReader = Dss.SymbolReaderWriterFactory.Create(pdbContext, metadata, pdbStream);
                }
                else
                {
                    symReader = CreateManaged(pdbContext, metadata, pdbStream);
                }

                if (symReader is not null)
                {
                    error = false;
                    return(symReader);
                }
            }
        public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, string pdbFileName)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            return(CreateCore(pdbContext, metadata, DataReaderFactoryUtils.TryCreateDataReaderFactory(pdbFileName)));
        }
        public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, byte[] pdbData)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            return(CreateCore(pdbContext, metadata, ByteArrayDataReaderFactory.Create(pdbData, filename: null)));
        }
        public static SymbolReader CreateFromAssemblyFile(PdbReaderOptions options, Metadata metadata, string assemblyFileName)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            if (!pdbContext.HasDebugInfo)
            {
                return(null);
            }
            if (!pdbContext.TryGetCodeViewData(out var guid, out uint age, out var pdbWindowsFilename))
            {
                return(null);
            }

            string pdbFilename;
            int    index = pdbWindowsFilename.LastIndexOfAny(windowsPathSepChars);

            if (index >= 0)
            {
                pdbFilename = pdbWindowsFilename.Substring(index + 1);
            }
            else
            {
                pdbFilename = pdbWindowsFilename;
            }

            string fileToCheck;

            try {
                fileToCheck = assemblyFileName == string.Empty ? pdbFilename : Path.Combine(Path.GetDirectoryName(assemblyFileName), pdbFilename);
                if (!File.Exists(fileToCheck))
                {
                    var ext = Path.GetExtension(pdbFilename);
                    if (string.IsNullOrEmpty(ext))
                    {
                        ext = "pdb";
                    }
                    fileToCheck = Path.ChangeExtension(assemblyFileName, ext);
                }
            }
            catch (ArgumentException) {
                return(null);               // Invalid filename
            }
            return(Create(options, metadata, fileToCheck));
        }
        public static SymbolReader Create(PdbReaderOptions options, Metadata metadata, DataReaderFactory pdbStream)
        {
            var pdbContext = new PdbReaderContext(metadata.PEImage, options);

            return(CreateCore(pdbContext, metadata, pdbStream));
        }