动态地在运行时将代码添加到方法的开头/结尾

我知道instrumentation是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。

我想知道这是否只是一个“跟踪”选项,硬编码到CLR中只添加跟踪代码,或者是否有能力向方法添加任何代码?

例如,我想检查某个类中每个方法调用开头的条件(比如权限)。 我可以通过在执行时间的方法开头添加动态代码来实现吗?

我不确定这种跟踪“仪器”的工作原理是什么,但我想知道这是否可以用于其他目标。

基本上你应该做的是编写一个CLR分析器并在c ++中使用profiler API
您需要实现ICorProfilerCallback接口。
您正在寻找的是JITCompilationStarted回调。 每次调用托管方法时以及在jit编译器将IL编译为机器代码之前,都会调用此方法。 运行时期间的任何代码插入工作都应在JITCompilationStarted中完成。
您可以查看开源覆盖工具部分封面作为示例,了解如何执行此操作。

您指的是面向方面编程(AOP)。

看看PostSharp 。

另外: C#中的开源面向方面框架

正如其他人已经回答的那样,这种跨领域问题经常通过面向方面编程 (AOP)来解决。

进行AOP的一种方法是使用PostSharp等工具进行代码检测,但不需要额外工具的替代方法是使用dependency injection (DI)和Decorator设计模式。

想象一下,您的代码使用IFoo接口:

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

您可能有一个IFoo的具体实现MyFoo ,但您也可以编写一个或多个处理不同方面的装饰器:

 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容器)在AdministratorGuardingFoo包装MyFoo 。 消费IFoo所有消费者都不会注意到这种差异。

我知道PostSharp允许您通过归因向现有方法添加“方面”,因此您可以在方法中添加进入/退出跟踪