#c# #.net #pdb-files
Вопрос:
Я хотел прочитать подробную информацию, такую как URL-адреса документов (=пути к документам) из PDB-файла (в моем конкретном случае PDB для Windows, а не портативный PDB), но не смог найти простой и прямой пример.
Ответ №1:
После некоторых исследований я пришел к следующему выводу, и я просто хочу поделиться им, так как подобный пост был бы тем, что я искал в первую очередь:
- Добавьте ссылку на пакет в Microsoft.DiaSymReader.Родной
- Создайте вспомогательный класс, подобный следующему. На данный момент это просто чтение и возврат путей к документам, но, конечно, мы также могли бы извлечь несколько других деталей.
Важный:
- Чтобы это работало, в проекте должен быть разрешен небезопасный код.
- Также обратите внимание, что это шаги для PDF-файлов Windows (не портативных PDF-файлов).
/// <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();
}
}
}
Кредиты: Самой большой помощью был этот файл. Спасибо Кириллу Осенкову!