#c# #.net-core #console-application #code-injection #mono.cecil
Вопрос:
Мне нужно отслеживать строки исходного кода, на основе которых должны быть введены определенные инструкции.
Шаги, которые я выполнил, приведены ниже:
- Создал свой проект в режиме отладки, который генерировал библиотеки DLL и соответствующие PDF-файлы(это были инкрементные PDF-файлы, и в них не было информации о точках последовательности всех методов).
- Поместил DLL и PDB в одну папку и использовал ее с Mono.cecil для получения информации о точках последовательности и ввел инструкции. Это отлично работало для методов, у которых была информация о точках последовательности в PDB
- Опять же, я построил свой проект в режиме отладки, но на этот раз добавил код ниже в файл csproj
<PropertyGroup> <DebugType>Full</DebugType> <PropertyGroup/>
Это сгенерировало полный файл PDB вместе с библиотеками DLL
- При использовании DLL и полной PDB в одном и том же пути к файлу на этот раз Mono.cecil выдает ошибку ниже
Моно.Исключение Cecil.Cil.SymbolNotFoundException: ‘Для файла не найден символ my_file_pathabc.dll»
Как мне заставить Mono.cecil работать с полными PDF-файлами вместо инкрементных PDF-файлов.
Заранее спасибо.
Ответ №1:
- Какая версия Моно.Сесил, которым ты пользуешься?
- Как вы настраиваете считыватель PDB?
По крайней мере, с последней версией (0.11.4) работает следующий код:
using Mono.Cecil;
using Mono.Cecil.Rocks;
class Program
{
static void Main(string[] args)
{
var p = new ReaderParameters();
p.ReadSymbols = true;
using var x = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location, p);
foreach(var m in x.MainModule.GetAllTypes().SelectMany(t => t.Methods).Where(m => m.DebugInformation != null amp;amp; m.DebugInformation.HasSequencePoints))
{
foreach(var d in m.DebugInformation.GetSequencePointMapping())
{
System.Console.WriteLine($"{d.Key} => {d.Value.Document.Url} ({d.Value.StartLine},{d.Value.StartColumn})");
}
}
}
}
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<DebugType>Full</DebugType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Mono.Cecil" Version="0.11.4" />
</ItemGroup>
</Project>
Комментарии:
1. Я использую версию 0.11.4. Библиотека DLL проекта полностью независима от EXE-файла, использующего Mono.cecil, поэтому я указываю путь к файлу следующим образом: var readParams = новые параметры чтения(){ ReadSymbols = true }; var assembDef = Определение сборки. Сборка для чтения(«local_folder_pathabc.dll», readParams); Полная PDB (abc.pdb) помещается в тот же путь вместе с DLL
2. @yeshathakrar Обработка внешней сборки не должна иметь никакого значения. Я попробовал с внешним, и это сработало (т. Е. Приведенный выше код указывает последовательность на консоль). Как вы строите свои сборки? Который. Сетевая версия?