Mono.Cecil AssemblyDefinition.ReadAssembly (): для файла не найдено символов - PullRequest
0 голосов
/ 16 мая 2019

Я использую Mono.Cecil 0.10.3.0, последнюю версию от nuget.

Эта строка:

var ad = AssemblyDefinition.ReadAssembly(@"C:\path\to\my\library.dll", new ReaderParameters { ReadSymbols = true });

выдает исключение:

Mono.Cecil.Cil.SymbolsNotFoundException was unhandled by user code
  HResult=-2147024894
  Message=No symbol found for file: C:\path\to\my\library.dll
  Source=Mono.Cecil
  StackTrace:
       at Mono.Cecil.Cil.DefaultSymbolReaderProvider.GetSymbolReader(ModuleDefinition module, String fileName)
       at Mono.Cecil.ModuleReader.ReadSymbols(ModuleDefinition module, ReaderParameters parameters)
       at Mono.Cecil.ModuleReader.CreateModule(Image image, ReaderParameters parameters)
       at Mono.Cecil.ModuleDefinition.ReadModule(String fileName, ReaderParameters parameters)
       at Mono.Cecil.AssemblyDefinition.ReadAssembly(String fileName, ReaderParameters parameters)

Чтоэта ошибка означает?Разве это не найти library.pdb?Поскольку файл .pdb существует.

Вот еще одна странная проблема в этой проблеме.Вызов ReadAssembly () будет нормально работать в одной версии набора кодов, но затем я создам новую ветвь кода в git и попробую ту же строку в новой ветке, и она не удастся.

1 Ответ

0 голосов
/ 16 мая 2019

Я не уверен, что это поможет вам, и я никогда не использовал это лично, но я просмотрел код здесь и прокомментировал его для вашего удовольствия

static void ReadSymbols(ModuleDefinition module, ReaderParameters parameters)
{
   var symbol_reader_provider = parameters.SymbolReaderProvider;

   if (symbol_reader_provider == null && parameters.ReadSymbols)
      symbol_reader_provider = new DefaultSymbolReaderProvider(); // we get here

   if (symbol_reader_provider != null)
   {
      module.SymbolReaderProvider = symbol_reader_provider;

      var reader = parameters.SymbolStream != null
                      ? symbol_reader_provider.GetSymbolReader(module, parameters.SymbolStream)
                      : symbol_reader_provider.GetSymbolReader(module, module.FileName); // we get here

      ...
   }

   ...
}

Реализация GetSymbolReader

public ISymbolReader GetSymbolReader(ModuleDefinition module, string fileName)
{

   ...

   // this just changes the extension
   var pdb_file_name = Mixin.GetPdbFileName(fileName);

   // this should be true
   if (File.Exists(pdb_file_name))
   {
      if (Mixin.IsPortablePdb(Mixin.GetPdbFileName(fileName)))
         return new PortablePdbReaderProvider().GetSymbolReader(module, fileName);

      try
      {
         return SymbolProvider.GetReaderProvider(SymbolKind.NativePdb).GetSymbolReader(module, fileName);
      }
      catch (Exception)
      {
         // We might not include support for native pdbs.
      }
   }

   // cant find the pdb file, your error
   if (throw_if_no_symbol)
      throw new SymbolsNotFoundException(string.Format("No symbol found for file: {0}", fileName));

   return null;
}

Определение GetPdbFileName

public static string GetPdbFileName(string assemblyFileName)
{
   return Path.ChangeExtension(assemblyFileName, ".pdb");
}

Итак, как вы можете видеть, здесь что-то упущено,

весь этот код

  1. Измените расширение имени вашего файла, чтобы найти PBD ,

  2. Проверяет, существует ли файл PBD ,

  3. Если нет, выдает исключение, которое вы получаете

Я думаю, вам нужно проверить все дважды, также обратите внимание,

// We might not include support for native pdbs.

это единственный способ, которым эта ошибка может выдать

...