Well, AOP is just an idea, you have a lot of ways to achieve it. If you need to have something explicitly called AOP, there are some good implementations available, i.e. classical AspectJ for Java or PostSharp for .NET. But decision to use any of these have to be made carefully. They have quite large learning curve and very often can lead to the code that is some kind of black magic for developers not aware of how AOP is used in a project or not aware of AOP at all.
In C# there are at least two ways to achieve AOP-ish system. First one uses IL modification after the compilation (PostSharp works this way). Second one can be thought as a runtime framework that generates dynamic proxies on your objects (using Castle Dynamic Proxy, Unity Interception from MS Patterns & Practices etc.). Both way have their pros and cons. The second way is much less powerful (you can't interfere with static object structure such as inheritance tree etc.) and has worse performance due to heavy reflection usage. And one can say that dynamic proxy can't be used to do "real" AOP, but for me it allows you to achieve what AOP main goal is - to add custom behaviors to your objects dynamically, without modifying their code, in different places of the system at once. And in my opinion, it is easier to be tested, cleaner, easier to understand, more portable, more flexible.
But after all, I will try to avoid using AOP, especially in newly developed projects. If you are on early development stage, try to design structure that will be easily extensible and modular: use inversion of control, split your logic into loosely coupled modules, work on abstractions and you shouldn't need AOP at all.