【问题标题】:Extracting PDB signature from DLL file从 DLL 文件中提取 PDB 签名
【发布时间】:2020-01-13 18:34:37
【问题描述】:

我必须从 .pdb.dll 文件中提取 PDB 签名。

这是我用来从 .pdb 文件中提取它的代码。不幸的是,我还没有找到从 DLL 中提取它的类似方法。

        public static string GetPdbSignature(string pdbFilePath)
        {
            using (var pdbFileStream = File.OpenRead(pdbFilePath))
            {
                var metadataProvider = MetadataReaderProvider.FromPortablePdbStream(pdbFileStream);
                var metadataReader = metadataProvider.GetMetadataReader();
                var id = new BlobContentId(metadataReader.DebugMetadataHeader.Id);

                return $"{id.Guid.ToString("N")}ffffff";
            }
        }

我发现PeNet nuget 包可用于执行提取,但我更愿意在不安装外部依赖项的情况下实现这一点。

此外,我设法使用 dotPeek (screen) 找到了所需的数据,但由于我需要以编程方式解决问题,它也不能解决我的问题。

我很想知道如何解决这个问题。通过使用一些内置的 dotnet 机制或通过一些智能低级字节提取。

【问题讨论】:

  • "但由于我需要以编程方式解决问题,它也不能解决我的问题。"您可以查看反射在代码中执行此操作。首先查看 Assembly.Load

标签: c# debugging dll pdb portable-executable


【解决方案1】:

我设法找到了一个官方的 Microsoft 包 - Microsoft.Diagnostics.Tracing.TraceEvent,其中包含 PEFile 类,允许提取我需要的确切数据。

public static string GetDllSignature(string dllFilePath)
{
    var peFile = new PEFile.PEFile(dllFilePath);
    peFile.GetPdbSignature(out string pdbName, out Guid pdbGuid, out int pdbAge);

    return $"{pdbGuid.ToString("N")}ffffff";
}

更新:

实际上,System.Reflection.PortableExecutable 命名空间中还有一个 PEReader 类,它可以仅使用系统库进行读取。然而,它需要一些可移植可执行格式的知识,因为PEReader 没有提供明确的、用户友好的方法来提取签名,而是只允许获取 PE 文件包含的所有类型的数据。

public static string GetDllSignatureV2(string dllFilePath)
{
    using (var pdbStream = File.OpenRead(pdbPath))
    using (var peReader = new PEReader(pdbStream))
    {
        var debugDirectory = peReader.ReadDebugDirectory().First(entry => entry.Type == DebugDirectoryEntryType.CodeView);
        var codeViewData = peReader.ReadCodeViewDebugDirectoryData(debugDirectory);

        return $"{codeViewData.Guid.ToString("N").Replace("-", string.Empty)}FFFFFFFF".ToUpper();
    }
}

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多