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.
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:
You may have a concrete implmentation
MyFoo
of IFoo, but you can also write one or several Decorators that handle different aspects:You can now (have your DI Container) wrap
MyFoo
inAdministratorGuardingFoo
. All consumers that consumeIFoo
will not notice the difference.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.
The CLR allows method interception via message sinks.
You are referring to Aspect Oriented Programming (AOP).
Have a look at PostSharp.
Also: Open Source Aspect-Oriented Frameworks in C#
I know PostSharp allows you to add 'aspects' to existing methods via attributing so you can add entry/exit traces onto your methods