Как найти соответствующий .pdb внутри сборки .NET?

По-видимому, при создании сборки .NET расположение соответствующего пути к файлу .pdb включается внутрь. Ссылка для справки: https://msdn.microsoft.com/en-us/library/ms241613.aspx

Как мне получить к этому доступ? Я попытался использовать ILSpy, чтобы заглянуть внутрь моей сборки, но не смог найти.


person Andrew Pham    schedule 08.08.2016    source источник
comment
вы хотите получить путь программно или использовать инструмент?   -  person Jehof    schedule 08.08.2016


Ответы (3)


Вы можете использовать инструмент dumpbin из командной строки разработчика, например такая строка cmd

dumpbin /HEADERS YourAssembly.exe   

покажет путь к файлу PDB в разделе «Каталоги отладки», подобно этому

Microsoft (R) COFF/PE Dumper Version 14.00.24213.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file YourAssembly.exe

...


  Debug Directories

        Time Type        Size      RVA  Pointer
    -------- ------- -------- -------- --------
    570B267F cv           11C 0000264C      84C    Format: RSDS, {241A1713-D2EF-4838-8896-BC1C9D118E10}, 1,  
    C:\temp\VS\obj\Debug\YourAssembly.pdb

...
person DAXaholic    schedule 08.08.2016

Я пришел к следующему хакерскому решению.
У меня оно работает, но я не могу гарантировать его правильность :)

public string GetPdbFile(string assemblyPath) 
{
    string s = File.ReadAllText(assemblyPath);

    int pdbIndex = s.IndexOf(".pdb", StringComparison.InvariantCultureIgnoreCase);
    if (pdbIndex == -1)
        throw new Exception("PDB information was not found.");

    int lastTerminatorIndex = s.Substring(0, pdbIndex).LastIndexOf('\0');
    return s.Substring(lastTerminatorIndex + 1, pdbIndex - lastTerminatorIndex + 3);
}

public string GetPdbFile(Assembly assembly) 
{
    return GetPdbFile(assembly.Location);
}
person Yeldar Kurmangaliyev    schedule 08.08.2016

Прошло некоторое время, и теперь у нас есть крутые новые инструменты ядра .net.

Теперь вы можете сделать это легко:

  private static void ShowPDBPath(string assemblyFileName)
  {
     if (!File.Exists(assemblyFileName))
     {
        Console.WriteLine( "Cannot locate "+assemblyFileName);
     }
     Stream peStream = File.OpenRead(assemblyFileName);
     PEReader reader = new PEReader(peStream);         

     foreach (DebugDirectoryEntry entry in reader.ReadDebugDirectory())
     {
        if (entry.Type == DebugDirectoryEntryType.CodeView)
        {
           CodeViewDebugDirectoryData codeViewData = reader.ReadCodeViewDebugDirectoryData(entry);
           Console.WriteLine( codeViewData.Path);
           break;
        }
     }
  }
person Kinetic    schedule 15.07.2020