浅谈.NET编译时注入(C#--IL)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈.NET编译时注⼊(C#--IL)
.NET是⼀门多语⾔平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语⾔)的⼀种代码指令平台。

所以.NET语⾔的编译就分为了两部分,从语⾔到MSIL的编译(我喜欢称为预编译),和运⾏时的从MSIL到本地指令,即时编译(JIT)。

JIT编译分为经济编译器和普通编译器,在这⾥就不多说了,不是本⽂的重点。

本⽂主要讨论下预编译过程中我们能做的改变编译情况,改变⽣成的IL,从编译前后看看微软C#3.0⼀些语法糖,PostSharp的静态注⼊等等。

1:我们先来看看最简单的var:
C#:
public void TestVar()
{
var i = 0;
Console.WriteLine(i);
}
使⽤Reflector查看⽣成
IL:
反编译后的C#:
这⾥VS在编译的时候将var为我们转变为了int类型。

2:Action<int>:
C#:
public void TestAction()
{
var i = 1;
Func<int,int> f = t => t+1;
i=10;
f(i);
}
反编译后C#:
编译器为我们在这⾥⽣成了代理⽅法。

总结:
关于lambda表达式的编译规则:
当⼀个lambda expression被赋值给⼀个delegate类型,例如或者等,这个lambda expression会被编译器直接编译为
1) 当lambda expression没有使⽤闭包内的⾮局部引⽤也没有使⽤到this时,编译为⼀个私有静态⽅法;
2) 当lambda expression没有使⽤闭包内的⾮局部引⽤,但⽤到了this时,编译为⼀个私有成员⽅法;
3) 当lambda expression中引⽤到⾮局部变量,则编译为⼀个私有的内部类,将引⽤到的⾮局部变量提升为内部类的。

3:PostSharp:
PostSharp是结合了 MSBuild Task 和 MSIL Injection 技术,编译时静态注⼊实现 AOP 编程。

在编译时候改变VS的编译⾏为。

更详细的信息,请访问⽹站
原c#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
new Program().TestPostSharp();
}
[ErrorHandler()]
public void TestPostSharp()
{
throw new Exception("I will throw a exception!");
}
}
[Serializable]
public class ErrorHandlerAttribute : os.OnMethodBoundaryAspect
{
public override void OnException(os.MethodExecutionEventArgs eventArgs)
{
//do some AOP operation!
Console.WriteLine(eventArgs.Method+":" +eventArgs.Exception.Message);
eventArgs.FlowBehavior = os.FlowBehavior.Continue;
}
}
}
反编译后:
今天就到此为⾄,只是简单的了解下IL注⼊实例,在后⾯会利⽤MSBuild Task+Mono Cecil 和PostSharp实现⼀些简单的注⼊实例.。

相关文档
最新文档