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

简介: 原文:浅谈.NET编译时注入(C#-->IL)     .NET是一门多语言平台,这是我们所众所周知的,其实现原理在于因为了MSIL(微软中间语言)的一种代码指令平台。所以.NET语言的编译就分为了两部分,从语言到MSIL的编译(我喜欢称为预编译),和运行时的从MSIL到本地指令,即时编译(JIT)。
原文: 浅谈.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:

clip_image001

反编译后的C#:

clip_image002

这里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#:

clip_image004

clip_image005

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

总结:

关于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#:

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 : PostSharp.Laos.OnMethodBoundaryAspect

{

public   override   void  OnException(PostSharp.Laos.MethodExecutionEventArgs eventArgs)

{

// do some AOP operation!

Console.WriteLine(eventArgs.Method
+ " : "   + eventArgs.Exception.Message);

eventArgs.FlowBehavior 
=  PostSharp.Laos.FlowBehavior.Continue;

}

}

}

反编译后:

clip_image007

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

目录
相关文章
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
431 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
1天前
|
物联网 vr&ar 开发者
【专栏】.NET 技术:为开发注入活力
【4月更文挑战第29天】本文探讨了.NET技术的创新,主要体现在三个方面:1) .NET Core实现跨平台开发革命,支持多种操作系统和硬件,如.NET MAUI用于多平台UI;2) 性能提升与生产力飞跃,C#新特性简化编程,JIT和AOT优化提升性能,Roslyn提供代码分析工具;3) 引领现代化应用架构,支持微服务、容器化,内置安全机制。未来,.NET 7将带来更多新特性和前沿技术整合,如量子计算、AI,持续推动软件开发创新。开发者掌握.NET技术将赢得竞争优势。
|
1天前
|
人工智能 前端开发 开发工具
【专栏】.NET 技术:为开发注入新动力
【4月更文挑战第29天】本文探讨了.NET技术如何为开发注入新动力,分为核心优势、创新应用及挑战与机遇三部分。.NET提供统一多语言开发平台、强大的Visual Studio工具、跨平台能力、丰富的类库和活跃社区支持。在现代开发中,它应用于企业级、Web、移动、云服务和游戏开发。然而,面临性能优化、容器化、AI集成等挑战,.NET需持续创新。开发者应深入学习,抓住技术趋势,共同推动.NET技术进步。
|
XML 开发框架 前端开发
在ASP.Net Core下,Autofac实现自动注入
在ASP.Net Core下,Autofac实现自动注入
203 0
在ASP.Net Core下,Autofac实现自动注入
从openjdk.java.net获取OpenJDK8源码并编译(amd64/aarch64/arm64)
从openjdk.java.net获取OpenJDK8源码并编译(amd64/aarch64/arm64)
214 0
|
开发框架 .NET
ASP.NET Core 3.x Razor视图运行时刷新实时编译
ASP.NET Core 3.x Razor视图运行时刷新实时编译
100 0
|
存储 开发框架 自然语言处理
【.Net底层剖析】3.用IL来理解属性
【.Net底层剖析】3.用IL来理解属性
136 0
【.Net底层剖析】3.用IL来理解属性
【深入浅出.Net IL】1.一个For循环引发的IL
【深入浅出.Net IL】1.一个For循环引发的IL
111 0
【深入浅出.Net IL】1.一个For循环引发的IL
|
物联网 Linux KVM
X86模拟龙芯与编译.NET CoreCLR
X86模拟龙芯与编译.NET CoreCLR
369 0
X86模拟龙芯与编译.NET CoreCLR
|
容器 .NET 开发框架
.net core 注入中的三种模式:Singleton、Scoped 和 Transient
我们都知道在 Startup 的 ConfigureServices 可以注入我们想要的服务,那么在注入的时候有三种模式可以选择,那么我们在什么时候选择什么样的模式呢? 在讲注入模式之前,我觉得很有必要了解服务生存期的概念! 服务生存期:ASP.NET Core 提供了一个内置的服务容器 IServiceProvider 负责管理服务的生命周期,从被依赖注入容器创建开始(就是将服务注入到你要使用的类的构造函数中),然后框架负责创建依赖关系的实例,并在不再需要时对其进行处理(就是说等我们调用完服务时,容器会自己去对注入的服务进行释放)。
1814 0