Добавление кода к началу / конец методов во времени выполнения динамично

Я знаю, что инструментарий является техникой для добавления кода трассировки динамично в методы, чтобы позволить проследить и отладить.

Я задавался вопросом - ли это только опция "Trace", трудно кодированная в CLR для добавления только кода трассировки, или является там способностью добавить какой-либо код к методам?

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

Я не уверен, как эта вещь "инструментария" трассировки работает, но я задаюсь вопросом, может ли это использоваться для других целей также, или нет.

9
задан Iravanchi 17 March 2010 в 11:41
поделиться

5 ответов

В основном, что вам нужно сделать, это написать CLR-профилировщик и использовать API профилировщика в c++
. Вам нужно реализовать интерфейс ICorProfilerCallback.
То, что вы ищете, находится в обратном вызове JITCompilationStarted. Этот метод вызывается каждый раз, когда вызывается управляемый метод и до того, как jit-компилятор компилирует IL в машинный код. Любая работа по вставке кода во время выполнения должна выполняться в JITCompilationStarted.
Вы можете посмотреть на инструмент покрытия с открытым исходным кодом part cover в качестве примера, как это сделать.

4
ответ дан 4 December 2019 в 21:49
поделиться

Вы имеете в виду аспектно-ориентированное программирование (АОП).

Взгляните на PostSharp .

Также: Аспектно-ориентированные фреймворки с открытым исходным кодом на C #

3
ответ дан 4 December 2019 в 21:49
поделиться

Как уже ответили другие, такие сквозные проблемы часто решаются с помощью Аспектно-ориентированного программирования (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 , не заметят разницы.

2
ответ дан 4 December 2019 в 21:49
поделиться

Я знаю, что PostSharp позволяет добавлять «аспекты» к существующим методам с помощью атрибуции so вы можете добавить в свои методы трассировки входа / выхода

0
ответ дан 4 December 2019 в 21:49
поделиться

CLR разрешает перехват метода через приемники сообщений.

0
ответ дан 4 December 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: