There are several different techniques when using AOP in .NET, where runtime sub classing is probably the most commonly used.

I've always seen having to declare your members as virtual for being able to intercept (or advice)as a drawback, but Roger Johansson pointed out something to me the other day. Assume you want to make it impossible to override a member, and thereby avoid the extra work and responsibility of supporting sub classing. Then that decision should affect both ordinary sub classing and when sub classing is used for reasons of AOP. And if you make the member virtual, you are prepared for having it redefined, again both by ordinary sub classing and AOP-ish sub classing. It makes sense, doesn't it?

Today Roger posted a great writeup about different techniques for AOP, called Code mangling AOP vs. Runtime Proxy AOP.