Adding code to the beginning / end of methods in r

2020-02-12 04:07发布

I know instrumentation is a technique to add trace code dynamically into the methods to enable tracing and debugging.

I was wondering if this is only a "Trace" option, hard coded into the CLR to add only trace code, or is there the ability to add any code to the methods?

For example, I want to check for a condition in the beginning of every single method call in a certain class (say for permissions). Can I do this via adding dynamic code to the beginning of the methods in execution time?

I'm not sure how this trace "instrumentation" thing works, but I'm wondering if this can be used for other goals too, or not.

5条回答
爱情/是我丢掉的垃圾
2楼-- · 2020-02-12 04:20

As others have answered, such Cross-Cutting Concerns are often addressed with Aspect Oriented Programming (AOP).

One way to do AOP is with code instrumentation with tools such as PostSharp, but an alternative that requires no extra tools is by utilizing Dependency Injection (DI) and the Decorator design pattern.

Imagine that your code consumes the IFoo interface:

public interface IFoo
{
    string GetStuff(string request);
}

You may have a concrete implmentation MyFoo of IFoo, but you can also write one or several Decorators that handle different aspects:

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);            
    }
}

You can now (have your DI Container) wrap MyFoo in AdministratorGuardingFoo. All consumers that consume IFoo will not notice the difference.

查看更多
Fickle 薄情
3楼-- · 2020-02-12 04:21

Basically what you should do is write a CLR profiler and use the profiler API in c++
You need to implement the ICorProfilerCallback interface.
What you are looking for is in the JITCompilationStarted callback. This method is called each time a managed method gets called and before the jit compiler compiles the IL into machine code. Any code insertion work during run time should be done in JITCompilationStarted.
You can look at the open source coverage tool part cover as an example how to do it.

查看更多
淡お忘
5楼-- · 2020-02-12 04:28

You are referring to Aspect Oriented Programming (AOP).

Have a look at PostSharp.

Also: Open Source Aspect-Oriented Frameworks in C#

查看更多
霸刀☆藐视天下
6楼-- · 2020-02-12 04:43

I know PostSharp allows you to add 'aspects' to existing methods via attributing so you can add entry/exit traces onto your methods

查看更多
登录 后发表回答