.NET 4.0:一段动态绑定代码的底层初级分析

  随着本月12号VS2010的正式发布,相信越来越多的人都会把开发工具升级到VS2010。同时,相信很多人都会用到C# 4.0提供的新功能-动态绑定。我们知道,动态绑定在.NET Framework 4.0里通过一个叫做DLR的来执行的。那么它是怎样实现的呢?请看下面一段代码:

 public dynamic Foo(dynamic x, dynamic y)
 { 
      
return x / y;
 }

  这个方法代表可以处理所有数值类型的dynamic版本。首先,我们把这个方法编译,然后通过Reflector(版本号:6.1.0.11)查看这个方法的反编译结果,我们会看到如下这样的一个方法:

ExpandedBlockStart.gif代码
 [return: Dynamic]
 
private static object Foo([Dynamic] object x, [Dynamic] object y)
 {
      
if (<Foo>o__SiteContainer2.<>p__Site3 == null)
      {
           
<Foo>o__SiteContainer2.<>p__Site3 = CallSite<Func<CallSite, 
          
object, object, object>>.Create(Binder.BinaryOperation(
          CSharpBinderFlags.None, ExpressionType.Divide, 
          
typeof(Program), new CSharpArgumentInfo[] 
          {
               CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, 
null),
               CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, 
null)
             }));
        }
            
return <Foo>o__SiteContainer2.<>p__Site3.Target(
            
<Foo>o__SiteContainer2.<>p__Site3, x, y);
        }

其中,Program是当前Foo方法所在类的类名。我们会发现,<Foo>o__SiteContainer2这段特殊的代码,通过Reflector的帮助,我们会看到<Foo>o__SiteContainer2的原型如下:

[CompilerGenerated]
private static class <Foo>o__SiteContainer2
{

    public static CallSite<Func<CallSite, object, object, object>> <>p__Site3;
}

原来,编译器生成了一个静态类。再往后看,我们会发现另一个特殊的类:CallSite<T>。在Reflector的帮助下,我们顺利的在System.Runtime.CompilerServices命名空间下找到了它, 我们会看到CallSite<T>类继承自CallSite类。然后,我们找到CallSite<T>类的静态Create方法,代码如下:

public static CallSite<T> Create(CallSiteBinder binder)
{
    
return new CallSite<T>(binder);
}

然后,我们找到CallSite<T>类的对应构造方法的源代码:

private CallSite(CallSiteBinder binder) : base(binder)
{
    
this.Target = this.GetUpdateDelegate();
}

然后,我们找到GetUpdateDelegate方法的源代码

private T GetUpdateDelegate()
{
    
return this.GetUpdateDelegate(ref CallSite<T>._CachedUpdate);
}

再找到GetUpdateDelegate方法的另一个重载版本,如下:

private T GetUpdateDelegate(ref T addr)
{
    
if (((T) addr) == null)
    {
        addr 
= this.MakeUpdateDelegate();
    }
    
return addr;
}

于是,我们再找到MakeUpdateDelegate方法,代码如下:

ExpandedBlockStart.gif代码
internal T MakeUpdateDelegate()
{
    Type[] typeArray;
    Type delegateType 
= typeof(T);
    MethodInfo method 
= delegateType.GetMethod("Invoke");
    
if (delegateType.IsGenericType && CallSite<T>.IsSimpleSignature(method, out typeArray))
    {
        MethodInfo info2 
= null;
        MethodInfo info3 
= null;
        
if (method.ReturnType == typeof(void))
        {
            
if (delegateType == DelegateHelpers.GetActionType(typeArray.AddFirst<Type>(typeof(CallSite))))
            {
                info2 
= typeof(UpdateDelegates).GetMethod("UpdateAndExecuteVoid" + typeArray.Length, BindingFlags.NonPublic | BindingFlags.Static);
                info3 
= typeof(UpdateDelegates).GetMethod("NoMatchVoid" + typeArray.Length, BindingFlags.NonPublic | BindingFlags.Static);
            }
        }
        
else if (delegateType == DelegateHelpers.GetFuncType(typeArray.AddFirst<Type>(typeof(CallSite))))
        {
            info2 
= typeof(UpdateDelegates).GetMethod("UpdateAndExecute" + (typeArray.Length - 1), BindingFlags.NonPublic | BindingFlags.Static);
            info3 
= typeof(UpdateDelegates).GetMethod("NoMatch" + (typeArray.Length - 1), BindingFlags.NonPublic | BindingFlags.Static);
        }
        
if (info2 != null)
        {
            CallSite
<T>._CachedNoMatch = (T) info3.MakeGenericMethod(typeArray).CreateDelegate(delegateType);
            
return (T) info2.MakeGenericMethod(typeArray).CreateDelegate(delegateType);
        }
    }
    CallSite
<T>._CachedNoMatch = this.CreateCustomNoMatchDelegate(method);
    
return this.CreateCustomUpdateDelegate(method);
}

  一切都明白了。原来,.NET通过一个中间静态类来保存CallSite<T>,只有在第一次执行时,才执行以上这些消耗性能的步骤,第二次执行时,速度会快得多。

  最后,在Reflector的帮助下,我们初步理解了动态绑定的执行过程,对于程序员来讲,这非常重要。

 

 

 

 

转载于:https://www.cnblogs.com/myshell/archive/2010/04/25/1719946.html

.NET Framework 1.0到4.0底层演进:CLR、泛型、LINQ与并发模型的技术脉络 .NET Framework 是微软构建的统一托管运行时平台,其核心在于公共语言运行时(CLR)对内存管理、线程调度与类型系统的深度控制。从1.0初代寄生式设计,到2.0引入分代垃圾回收与泛型支持,再到3.5依托表达式树实现LINQ声明式查询,最终在4.0完成IOCP线程池与Task并行库的工程落地——这一演进本质是运行时能力持续解耦、强化与标准化的过程。它奠定了现代.NET跨平台、高性能与安全隔离的技术根基,广泛应用于企业级Web服务、桌面应用及混合部署系统。理解CLR版本差异、泛型JIT特化机制与LIN 阅读详情

相关推荐

全面掌握.NET Framework 4.0开发与特性

NET Framework 4.0概述.NET Framework 4.0是微软公司在2010年发布的.NET平台的最新版本,它是.NET Framework 3.5的升级版本,提供了许多新的特性和改进。.NET Framework 4.0支持多种编程语言,包括C#、VB.NET、F#等,它包括一个庞大的类库,覆盖了从文件输入输出到复杂业务逻辑处理的各个方面。.NET Framework 4.0的重要性与应用领域。

weixin_35433448的博客 1396

第二人生的源码分析(6)类CallSite的实现

类CallSite提供了保存一行Log的信息,以便保存所有的LOG到容器里,方便管理以及输出到文件,同时输出到其它需要输出的界面。使用这个类是先调类CallSite的构造函数来保存Log所在的函数名称、类名称、文件名称和行号,还有是否需要输出Log等信息,接着就保存在类Log里保存到全局的容器里。它的代码如下:#001 namespace LLError#002 {#003  Call

大坡3D软件开发 4709

c# 4.0新特性一览

c# 4.0新特性一览PPT c# 4.0新特性一览PPT

[C# 4.0] Dynamic 修改反译出现的问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34355881的博客 502

wpf入门第五篇 WPF with ECharts

前言 本文是wpf入门系列第五篇,面向有winform或者web前端基础的、并且也有C#基础的同学。 ECharts是百度团队开发的开源免费的js图表控件库,非常强大,文档齐全。WPF中使用图表,除了可以选择devexpress或者oxyplot之类的专为wpf开发的图表控件之外,还可以考虑使用 WebBrowser+ECharts 来完成复杂的图表展示,其展示效果不亚于前者。 本文介绍了 WP...

wf824284257的博客 1万+

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 221

C#编程(六十九)----------DLR简介

DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象深刻.       C#4动态功能是Dynamic Language Runtime(动态语言运行时,DLR)的一部分.DLR是添加到CLR的一系列服务,它允许添加动态语言,如Ruby和Python,...

weixin_34203832的博客 390

小白学习图像处理6——Canny边缘检测算法原理

目录结构一、高斯滤波二、梯度计算1、原理2、代码如下三、非极大值抑制三、双阈值检测四、matlab 的 edge函数五、总结 Canny边缘检测算法主要步骤:高斯滤波、梯度计算、非极大值抑制和双阈值检测。 一、高斯滤波   使用高斯滤波的目的是平滑图像,滤除图像中的部分噪声(因为微分算子对噪声很敏感)。高斯滤波具体办法是生成一个高斯模板,使用卷积进行时域滤波: img = im2double(im...

我有两颗糖 7791

[C#基础知识系列]专题十七:深入理解动态类型

本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言:   终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善——Com 互操作性的改进和动态类型的引入,然而COM互操作性这里就不详细介绍的,对于.Net 互操作性我将会在另外一个专题中详...

weixin_33726943的博客 527

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

作为经典畅销书的升级版,本书在第1版的基础上新增了大量新知识(如闪存、UFS、测试、文件系统等),并改写或删减了许多过时或不适用的内容,总修改量超过60%。本书由SSD技术社区SSDFans的核心团队成员联合业界、高校SSD方面的专家共同完成,相对于第1版,内容更全面、更新,也更有深度。本书从产品、技术和应用3个维度展开,全面、详细讲解了SSD的发展历史、产品形态、工作原理、整体架构,以及各个功能模块的原理和使用,从SSD的前端接口协议到FTL算法,再到后端的闪存和纠错,以及测试,本书都有涉及。

阿玥的小博客 3122

保姆级教程:在Android车机上从零配置USB Gadget,搞定CarPlay有线连接

本文详细介绍了在Android车机上从零配置USB Gadget以实现CarPlay有线连接的完整实践指南。涵盖内核驱动开发、Android系统配置及用户空间通信架构,帮助开发者深入理解USB子系统和iAP2协议栈,实现稳定可靠的CarPlay有线连接功能。

weixin_30621711的博客 472

一起谈.NET技术,C# 4动态编程新特性与DLR剖析

近几年来,在TIOBE 公司每个月发布的编程语言排行榜 [1] 中,C# 总是能挤进前10 名,而在近10 年的编程语言排行榜中,C# 总体上呈现上升的趋势。C# 能取得这样的成绩,有很多因素在起作用,其中,它在语言特性上的锐意进取让人印象深刻( 图1 )。   图1 C#各版本的创新点 2010 年发布的 C# 4 ,最大的创新点是拥有了动态编程语言的特性。 1 动态编程语言的中兴 ...

weixin_34099526的博客 261

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示

Just Linux! 1113

C#4.0 动态绑定(Dynamic Binding)

  .NET 4.0引入了一个新概念,叫动态绑定。所谓绑定,就是对类型、成员和操作的解析过程。动态绑定意味着与编译器无关,而与运行时有关。 一、 基本概念 C# 4.0之前的变量声明,在编译时已经决定其类型,虽然C# 3.0提供了var关键字来声明隐式类型,但用var声明的变量终究逃不过编译器的法眼。用dynamic声明变量的好处是,编译器在编译时并不知道它引用对象的确...

devo4561的博客 350

OCR模型轻量化新思路:用ONNX Runtime加速PP-OCRv4推理(附性能对比测试)

本文详细介绍了如何利用ONNX Runtime对PP-OCRv4模型进行轻量化部署与推理加速。通过模型导出优化、动态量化、线程绑定及内存复用等技巧,在树莓派、RK3588等边缘设备上实现了超过50%的性能提升,并显著降低了内存占用,为移动端OCR部署提供了完整的优化方案和实测数据对比。

weixin_29063979的博客 496

uniapp(全端兼容) - 超详细接入百度统计功能,给uniapp全平台各端项目引入添加百度统计的插件统计流量详细的步骤教程(提供最新的百度统计源代码,详细的示例代码复制粘贴即可快速搞定!)

uniapp h5 app 使用加入接入百度统计,uniapp百度统计,uniapp详细引入百度统计的教程,uniapp接入百度统计,uniapp如何实现加入百度的统计代码,uniapp怎么植入百度统计详细教程,uniapp如何对接百度统计,uniapp百度统计不生效怎么办,uniapp使用百度统计不生效常见问题,uniapp引入百度统计后没有生效,uniapp h5网页接入百度统计代码后没有统计无效,uniapp最新接入使用百度统计功能,uniapp增加百度统计代码,uniapp app如何接入百度统计,

✅ 精选推荐文章 1万+

.NET 4.0 精进不休:约定优于配置与 dynamic 的技术基因溯源

约定优于配置(Convention over Configuration)和 dynamic 是现代 .NET 开发的两大基石概念,前者推动框架从显式声明转向智能推断,后者赋予 C# 运行时动态互操作能力。其原理根植于 .NET 4.0 时代对开发效率与抽象层级的深度重构:通过内置默认约定减少样板代码,借助 DLR 实现跨语言与松耦合集成。这一设计哲学持续影响 EF Core 的 Fluent API、ASP.NET Core 的中间件管道及 JSON 序列化生态。在微服务、低代码和领域驱动开发等场景中,理

unixboy 485

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

.NET 剖析4.0上ExpandoObject动态扩展对象原理

在.NET/4.0它主打动态编程这应该是它的一大特性 但既然作为一个.NET技术平台的开发人员那么有必要去了解其运行原理 我不太清楚有没有人写过这方面的东西 但显然这对我而言并不重要 下方通过一个动态字典的底层实现阐述  在blog上写的内容 建议读众应好好读过C#高级编程(入门)、.NET本质论、深入理解.NET、Win32核心编程 上图是一张标准的动态对象扩展 我为它扩展一个Sa

liulilittle的博客 2547

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# 4.0 dynamic内幕揭秘:如何利用动态类型提升反射效率?

掌握C# 4动态类型提升反射效率,揭秘dynamic如何简化反射调用。适用于频繁反射场景,减少Invoke代码,提升执行性能,降低维护成本。结合DLR实现高效绑定,开发更简洁流畅。值得收藏

ProceSeed的博客 962

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

4.ASP.NET MVC 5.0 视图之模型绑定

大家好,这篇文章,我将向大家介绍ASP.NET MVC的模型视图绑定,ASP.MVC的模型绑定分为两种:一种是动态绑定【Dynamic Binding】;还有一种就是强类型绑定【Strongly typed binding】;【PS--上一篇文章:3.怎样将ASP.NET MVC应用程序发布到IIS】 当我们从控制器向视图传递数据的时候,我们会返回一个ViewRes...

a0103122120的博客 513

精进不休 .NET 4.0 系列文章索引

[源码下载]<br /><br /><br />精进不休 .NET 4.0 系列文章索引<br /><br /> 作者:webabcd<br /><br /><br /> 介绍<br /> 精进不休 .NET 4.0 系列文章索引:asp.net 4.0 新特性, c# 4.0 新特性, ADO.NET Data Services 1.5 新特性, ADO.NET Entity Framework 4.0 新特性<br /><br /><br /> 1、精进不休 .NET 4.0 (1) - asp

webabcd的专栏 872

“前.NET Core时代”如何实现跨平台代码重用 ——程序集重用

除了在源代码层面实现共享(“前.NET Core时代”如何实现跨平台代码重用 ——源文件重用)之外,我们还可以跨平台共享同一个程序集,这种独立于具体平台的“中性”程序集通过创建一种名为“可移植类库(PCL: Portable Class Library)”项目来实现。为了让读者朋友们对PCL的实现机制具有充分的认识,我们先来讨论一个被我称为“程序集动态绑定”的话题。   一、何谓程序集动态绑定?

sonioo的博客 2261

#版本、.NET版本、Visual Studio版本对应关系

#版本、.NET版本、Visual Studio版本对应关系 August 6, 2020 网上找的,我综合了下,信息不是特别精准,做参考没问题的。 C#版本 .NET版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002-02-13 委托、事件 C# 1.1 .NET Framework 1.1 Visual Studio .

格码老师教编程 2557

C# 与 .NET Framework 对应关系

C# 1.0 .NET Framework 1.0 2002-02-13 委托、事件 C# 1.1 .NET Framework 1.1 2003-04-24 ​ APM(异步编程模型) C# 2.0 .NET Framework 2.0 2005-11-07 VisualStudio 2005 泛型 分部类型 匿名方法 可以为 null 的值类型 迭代器 协变和逆变 泛型List<T>、匿名方法、迭代器yield、可空类型nullable C# 3.0 .NET Framew

anihasiyou的专栏 906
上一篇: Visual Studio 2010 RTM版安装初体验
下一篇: 将ASP.NET MVC 1.0升级到ASP.NET MVC 2的三种方法
devo4561
博客等级 码龄12年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值