c# - 如何在 C# 中读取 PDB 文件的详细信息
问题描述
我想从 PDB 文件(在我的特定情况下是 Windows PDB 而不是便携式 PDB)中读取文档 URL(=文档的路径)之类的详细信息,但找不到简单直接的示例。
解决方案
经过一些研究,我想出了以下内容,我只想分享它,因为这样的帖子本来就是我想要的:
- 添加对Microsoft.DiaSymReader.Native的包引用
- 创建一个如下所示的辅助类。目前这只是读取和返回文档路径,当然我们也可以提取其他一些细节。
重要:
- 项目中必须允许不安全的代码才能正常工作。
- 另请注意,这些是 Windows PDB(不是便携式 PDB)的步骤。
/// <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();
}
}
}
致谢:最大的帮助是这个文件。谢谢基里尔奥森科夫!
推荐阅读
- ios - 在哪里快速设置委托?
- javascript - 如何使用javascript表单提交
- java - Team 的集中式本地 Maven 存储库
- c - 函数使用链表分隔偶数和奇数
- c# - 使用 Roslyn 将 C# 字符串值转换为转义字符串文字
- python - 如何“pip install”一个只忽略一些特定依赖项的包?
- c# - 如何在每 10 条记录后将新行插入 JSON 值?
- python - 为什么在建立 mysql 到 python 连接时出现错误?
- javascript - 如何开玩笑地模拟@ViewChild MatTabGroup?
- python - 如何将字符串序列化为列表?