Как прочитать сведения о файле PDB на языке C#

#c# #.net #pdb-files

Вопрос:

Я хотел прочитать подробную информацию, такую как URL-адреса документов (=пути к документам) из PDB-файла (в моем конкретном случае PDB для Windows, а не портативный PDB), но не смог найти простой и прямой пример.

Ответ №1:

После некоторых исследований я пришел к следующему выводу, и я просто хочу поделиться им, так как подобный пост был бы тем, что я искал в первую очередь:

  1. Добавьте ссылку на пакет в Microsoft.DiaSymReader.Родной
  2. Создайте вспомогательный класс, подобный следующему. На данный момент это просто чтение и возврат путей к документам, но, конечно, мы также могли бы извлечь несколько других деталей.

Важный:

     /// <summary>
    /// Helper class to get specific contents of a PDB file.
    /// </summary>
    public static class PdbReader
    {
        /// <summary>
        /// Gets all paths of all documents from the given PDB.
        /// </summary>
        public static IReadOnlyCollection<string> GetAllDocumentPathsFromPdb(string path)
        {
            using var stream = new FileStream(path, FileMode.Open);
            var metadataProvider = new SymReaderMetadataProvider();
            var reader = SymUnmanagedReaderFactory.CreateReader<ISymUnmanagedReader5>(stream, metadataProvider);
            var result = reader.GetDocuments();

            return GetDocumentPaths(result).ToList();
        }

        private static IEnumerable<string> GetDocumentPaths(IEnumerable<ISymUnmanagedDocument> result)
        {
            foreach (var document in result)
            {
                var url = new char[256];
                document.GetUrl(url.Length, out var count, url);
                yield return new string(url, 0, count-1);
            }
        }

        /// <summary>
        /// Dummy implementation which is doing nothing.
        /// At the moment we just need it to pass *any* implementation of <see cref="ISymReaderMetadataProvider"/>
        /// to <see cref="SymUnmanagedReaderFactory.CreateReader{T}"/>.
        /// </summary>
        private class SymReaderMetadataProvider : ISymReaderMetadataProvider
        {
            public unsafe bool TryGetStandaloneSignature(int standaloneSignatureToken, out byte* signature, out int length)
            {
                throw new NotImplementedException();
            }

            public bool TryGetTypeDefinitionInfo(int typeDefinitionToken, out string namespaceName, out string typeName, out TypeAttributes attributes)
            {
                throw new NotImplementedException();
            }

            public bool TryGetTypeReferenceInfo(int typeReferenceToken, out string namespaceName, out string typeName)
            {
                throw new NotImplementedException();
            }
        }
    }
 

Кредиты: Самой большой помощью был этот файл. Спасибо Кириллу Осенкову!