Я знаю, что инструментарий является техникой для добавления кода трассировки динамично в методы, чтобы позволить проследить и отладить.
Я задавался вопросом - ли это только опция "Trace", трудно кодированная в CLR для добавления только кода трассировки, или является там способностью добавить какой-либо код к методам?
Например, я хочу проверить на условие в начале каждого вызова метода в определенном классе (скажите для полномочий). Я могу сделать это через добавление динамического кода к началу методов во время выполнения?
Я не уверен, как эта вещь "инструментария" трассировки работает, но я задаюсь вопросом, может ли это использоваться для других целей также, или нет.
В основном, что вам нужно сделать, это написать CLR-профилировщик и использовать API профилировщика в c++
.
Вам нужно реализовать интерфейс ICorProfilerCallback.
То, что вы ищете, находится в обратном вызове JITCompilationStarted. Этот метод вызывается каждый раз, когда вызывается управляемый метод и до того, как jit-компилятор компилирует IL в машинный код.
Любая работа по вставке кода во время выполнения должна выполняться в JITCompilationStarted.
Вы можете посмотреть на инструмент покрытия с открытым исходным кодом part cover в качестве примера, как это сделать.
Вы имеете в виду аспектно-ориентированное программирование (АОП).
Взгляните на PostSharp .
Также: Аспектно-ориентированные фреймворки с открытым исходным кодом на C #
Как уже ответили другие, такие сквозные проблемы часто решаются с помощью Аспектно-ориентированного программирования (AOP).
Одним из способов реализации АОП является инструментирование кода с такими инструментами, как PostSharp, но альтернативой, не требующей дополнительных инструментов, является использование внедрения зависимостей (DI) и дизайна Decorator . шаблон.
Представьте, что ваш код использует интерфейс IFoo:
public interface IFoo
{
string GetStuff(string request);
}
У вас может быть конкретная реализация MyFoo
IFoo, но вы также можете написать один или несколько декораторов, которые обрабатывают различные аспекты:
public class AdministratorGuardingFoo : IFoo
{
private readonly IFoo foo;
public AdministratorGuardingFoo(IFoo foo)
{
if (foo == null)
{
throw new ArgumentNullException("foo");
}
this.foo = foo;
}
public string GetStuff(string request)
{
new PrincipalPermission(null, "Administrator").Demand();
return this.foo.GetStuff(request);
}
}
Вы можете теперь (у вашего контейнера DI) оберните MyFoo
в AdministratorGuardingFoo
. Все потребители, потребляющие IFoo
, не заметят разницы.
Я знаю, что PostSharp позволяет добавлять «аспекты» к существующим методам с помощью атрибуции so вы можете добавить в свои методы трассировки входа / выхода
CLR разрешает перехват метода через приемники сообщений.