AspectInjector is a compile-time AOP framework which means that all required work is done at compile time. For example, before compilation your code looks like:
[Aspect(Scope.Global)]
[Injection(typeof(Log))]
class Log : Attribute
{
[Advice(Kind.Before, Targets = Target.Method)]
public void OnEntry([Argument(Source.Name)] string name)
{
Console.WriteLine($"Entering method {name}");
}
}
class TestClass
{
[Log]
public void Do()
{
Console.WriteLine($"Done");
}
}
Then when you hit F5, we pick up from there and change your assembly a bit, so it actually works like this:
[Aspect(Scope.Global)]
[Injection(typeof(Log))]
class Log : Attribute
{
public static readonly Log __a$_instance;
[Advice(Kind.Before, Targets = Target.Method)]
public void OnEntry([Argument(Source.Name)] string name)
{
Console.WriteLine($"Entering method {name}");
}
static Log()
{
__a$_instance = new Log();
}
}
internal class TestClass
{
[Log]
public void Do()
{
Log.__a$_instance.OnEntry("Do");
Console.WriteLine("Done");
}
}
Thus, there is no performance hit as often experienced with other runtime AOP frameworks.