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

简介:

      .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。JIT编译分为经济编译器和普通编译器,在这里就不多说了,不是本文的重点。本文主要讨论下预编译过程中我们能做的改变编译情况,改变生成的IL,从编译前后看看微软C#3.0一些语法糖,PostSharp的静态注入等等。

1:我们先来看看最简单的var:

C#:


 
 
  1. public void TestVar()  
  2.  
  3. {   
  4.    var i = 0;  
  5.    Console.WriteLine(i);  

使用Reflector查看生成

IL:

反编译后的C#:

这里VS在编译的时候将var为我们转变为了int类型。

2:Action<int>:

C#:


 
 
  1. public void TestAction()  
  2.  
  3. {  
  4.  
  5. var i = 1;  
  6.  
  7. Func<int,int> f = t => t+1;  
  8.  
  9. i=10;  
  10.  
  11. f(i);  
  12.  

反编译后C#:

编译器为我们在这里生成了代理方法。

总结:

关于lambda表达式的编译规则:

当一个lambda expression被赋值给一个delegate类型,例如Action<T>或者Func<T, TResult>等,这个lambda expression会被编译器直接编译为 
1) 当lambda expression没有使用闭包内的非局部引用也没有使用到this时,编译为一个私有静态方法; 
2) 当lambda expression没有使用闭包内的非局部引用,但用到了this时,编译为一个私有成员方法; 
3) 当lambda expression中引用到非局部变量,则编译为一个私有的内部类,将引用到的非局部变量提升为内部类的。

3:PostSharp:

PostSharp是结合了 MSBuild Task 和 MSIL Injection 技术,编译时静态注入实现 AOP 编程。在编译时候改变VS的编译行为。更详细的信息,请访问 PostSharp 网站

原c#:

 


 
 
  1. using System;  
  2.  
  3. using System.Collections.Generic;  
  4.  
  5. using System.Linq;  
  6.  
  7. using System.Text;  
  8.  
  9. namespace ConsoleApplication1  
  10.  
  11. {  
  12.  
  13. class Program  
  14.  
  15. {  
  16.  
  17. static void Main(string[] args)  
  18.  
  19. {  
  20.  
  21. new Program().TestPostSharp();  
  22.  
  23. }  
  24.  
  25. [ErrorHandler()]  
  26.  
  27. public void TestPostSharp()  
  28.  
  29. {  
  30.  
  31. throw new Exception("I will throw a exception!");  
  32.  
  33. }  
  34.  
  35. }  
  36.  
  37. [Serializable]  
  38.  
  39. public class ErrorHandlerAttribute : PostSharp.Laos.OnMethodBoundaryAspect  
  40.  
  41. {  
  42.  
  43. public override void OnException(PostSharp.Laos.MethodExecutionEventArgs eventArgs)  
  44.  
  45. {  
  46.  
  47. //do some AOP operation!  
  48.  
  49. Console.WriteLine(eventArgs.Method+":" +eventArgs.Exception.Message);  
  50.  
  51. eventArgs.FlowBehavior = PostSharp.Laos.FlowBehavior.Continue;  
  52.  
  53. }  
  54.  
  55. }  
  56.  

反编译后:

今天就到此为至,只是简单的了解下IL注入实例,在后面会利用MSBuild Task+Mono Cecil 和PostSharp实现一些简单的注入实例.







 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835136,如需转载请自行联系原作者


相关文章
|
2月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
6天前
|
开发框架 搜索推荐 算法
一个包含了 50+ C#/.NET编程技巧实战练习教程
一个包含了 50+ C#/.NET编程技巧实战练习教程
56 18
|
6天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
40 12
|
4天前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
C#/.NET/.NET Core拾遗补漏合集(24年12月更新)
|
4天前
|
开发框架 算法 .NET
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
C#/.NET/.NET Core技术前沿周刊 | 第 15 期(2024年11.25-11.30)
|
4天前
|
开发框架 Cloud Native .NET
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
C#/.NET/.NET Core技术前沿周刊 | 第 16 期(2024年12.01-12.08)
|
19天前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
37 5
|
27天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
85 13
|
2月前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
53 7
|
2月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)