ilspy

第十七节:从状态机的角度async和await的实现原理(新)

假如想象 提交于 2020-05-09 20:52:52
一. 深度剖析 准备:   先给VS安装一个插件ILSpy,这样更容易反编译代码进行查看,另外要注意反编译async和await的时候,要把C#代码版本改为4.0哦。 1.什么是状态机  (1).含义:通常我们所说的状态机(State Machine)指的是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,可以理解成一个状态转换图。 (状态机是计算机科学的重要基础概念之一,也可以说是一种总结归纳问题的思想,应用范围非常广泛)  (2).例子:自动门有两个状态,open 和 closed ,closed 状态下,如果读取开门信号,那么状态就会切换为 open 。open 状态下如果读取关门信号,状态就会切换为 closed .  (3).涉及到4个相关概念:   A.状态(State):一个状态机至少包括两个状态.(例如上面自动门的例子,有 open 和 closed 两个状态。)   B.事件(Event):事件就是执行某个操作的触发条件或者口令.(对于自动门,“按下开门按钮”就是一个事件。)   C.动作(Action):事件发生以后要执行的动作,一个action对应一个函数.(事件是“按开门按钮”,动作是“开门”)   D.变换(Transition):从一个状态转换成另外一个状态.(“开门过程”就是一个变换。)  (4). C

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

孤者浪人 提交于 2020-05-07 08:57:19
网上很多写使用WindowsMediaPlayer WMP控件的文章. 大多数都是从工具栏或COM导入. 最近正在做的CEF整合Asp.Net Core Blazor server side的过程中, 因为CEF编译支持mp4的dll是涉及了版权的问题, 不能随便干的. 要播放mp4, 可以用WinForms代劳. 执行WMP只是一小段代码, 不想导入dll , 去查API. 发现了微软的官方文档, 和我使用的MediaPlayer的API , 有出入. ? 经过多方查证, 验证, 发现原来 MediaPlayer 一共是2个版本 一个是最后到 6.4 的 classic 版本, 一个是从 7 之后的新版本. OK, 以下只是纪录以下两者的区别 首先参考这个: http://w3schools.sinsixx.com/media/media_playerref.asp.htm 6.4 7或以后 CLSID 22D6F312-B0F6-11D0-94AB-0080C74C7E95 6BF52A52-394A-11D3-B153-00C04F79FAA6 TypeLib c:\windows\system32\msdxm.tlb C:\Windows\system32\wmp.dll TypeLib MediaPlayer WMPLib ProgID   MediaPlayer

.NET进阶篇02-Delegate委托、Event事件

泪湿孤枕 提交于 2020-05-06 01:46:00
知识只有经过整理才能形成技能 内容目录 一、概述 二、解析委托知识点 1、委托本质 2、委托的使用 3、委托意义 逻辑解耦,减少重复代码 代码封装,支持扩展 匿名方法和Lambda表达式 异步多线程 多播委托 三、事件 四、总结 一、概述 先说下委托,委托我们也经常用到。详尽了解委托是必要的,不然在异步多线程的编程中会一头雾水。 委托本质就是一个类 ,和我们平常定义的类没多大区别。只是这个类的作用的是描述一些方法,没有数据成员。 一个委托定义了一类拥有同样返回类型和参数的方法规范 。委托的声明语法就是一个没有方法体的方法前面加上 delegate 关键字。既然本质是一个类,那它就可以在任何可以定义普通类的位置来定义委托。 委托是一个能把方法作为参数传递的对象 。 事件就简单了, 事件就是委托的一个实例 。 二、解析委托知识点 1、委托本质 在VS中编码中,声明委托后,会发现委托的着色提示和类时一样。 但好像不是很有说服力。高级语法都做了很好的封装,方便编码人员。.NET的二次编译,第一次编译成IL中间语言,中间语言也是一种编程语言,只是它不像高级语言那么方便人类阅读。我们可以通过一些工具(像ILSpy)反编译来窥探下它的内部逻辑。 如图中红框所示,我们定义的普通类MyDelegate和委托类型NoReturnPara(继承自MulticastDelegate)是一致的

C#泛型-装箱拆箱和类型安全,Java泛型是语法糖

落花浮王杯 提交于 2020-05-01 20:52:43
现在的netcore 3.1和最新的.netframework8早已经没有当初那个被人诟病的ArrayList了,但很巧这玩意不得不说,因为它决定了C#团队痛改前非,抛弃过往重新上路,上一段ArrayList案例代码。 public class ArrayList { private object[] items; private int index = 0; public ArrayList () { items = new object[ 10]; } public void Add (object item) { items[index++] = item; } } 上面这段代码,为了保证在Add中可以塞入各种类型 eg: int,double,class, 就想到了一个绝招用祖宗类object接收,这就引入了两大问题,装箱拆箱和类型安全。 1. 装箱拆箱 这个很好理解,因为你使用了祖宗类,所以当你 Add 的时候塞入的是值类型的话,自然就有装箱操作,比如下面代码: ArrayList arrayList = new ArrayList(); arrayList.Add( 3); <1> 占用更大的空间 这个问题我准备用windbg看一下,相信大家知道一个int类型占用4个字节,那装箱到堆上是几个字节呢,好奇吧😄。 原始代码和IL代码如下: public static

Dapper一个和petapoco差不多的轻量级ORM框架

做~自己de王妃 提交于 2020-04-25 14:31:53
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为the king of ORM。 一:为什么选择Dapper 1. 性能优越: 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco serialization的过程中所表现的性能,我们发现dapper是第二名, 当然第一名谁也无法超越,越底层的当然久越快,同时也就越麻烦。就好像谁能超过“01代码”呢??? 2. 支持多数据库 支持多数据库的本质是因为Dapper是对IDBConnection接口进行了方法扩展,比如你看到的SqlMapper.cs,一旦你这样做了,我们也知道, SqlConnection,MysqlConnection,OracleConnection都是继承于DBConnection,而DBConnection又是实现了IDBConnection的接口,对吧。。。 二:安装Dapper install dapper的方式通常有两种: 1. 通过nuget进行安装   如果你不知道怎么用nuget进行安装,或者不知道install-package是什么,可以在browser上找一下,比如下面这样: 然后我们copy到package console

科学使用Log4View2查看日志

和自甴很熟 提交于 2020-04-24 23:31:52
目录 目录 前言 科学使用 编辑和调试程序集 调试程序集 编辑程序集 结语 推荐文献 目录 NLog日志框架使用探究-1 NLog日志框架使用探究-2 科学使用Log4View2 前言 这个标题很低调吧,但是既然你点进来,那么接下来的干货是属于你的。 不想成为黑客的程序员不是好程序员。在上一篇 《NLog日志框架使用探究-2》 文章提到了Log4View2工具有30天的试用期,超过试用期许多功能就被限制,比如不能使用数据库加载。那么我们如何科学使用它呢? 本篇文章涉及到反编译技术、对称加密技术、IL中间语言等技术。掌握了这些技术之后你会发现原来自己也能更加科学的使用软件。 接下来的内容仅供个人学习使用,任何人不得用于商业用途或用于非法途径,一切后果本人概不负责。 科学使用 我们可以使用 dnspy 、 ilspy 以及reflector对.net程序进行反编译。Log4View2就是纯.net开发的项目。 reflector是收费的,也需要科学使用。 ILSpy是开源的.NET程序集浏览器和编译器。 dnSpy是一个调试器和.NET程序集编辑器。即使没有任何可用的源代码,也可以使用它来编辑和调试程序集。 dnspy也是基于ILSpy的反编译引擎,在它基础上增加了丰富的功能,甚至可以直接修改源代码。首先我们通过dyspy看看相关注册的源码,直接在安装路径找到Log4View

async/Await使用和原理

我是研究僧i 提交于 2020-04-24 03:01:41
await/async是.NetFramework4.5出现的,是语法糖,由编译器提供的功能! await/async 是C#保留关键字,通常是成对出现,一般的建议是:要么不用,要么用到底 async修饰方法,可以单独出现,但是没有任何意义,而且有警告 await在方法体,只能出现在task/async方法前面,只有await会报错 下面来使用代码来剖析async和await的用法。 一:只有一个async没有await 1 /// <summary> 2 /// 只有async没有await,会有个warn 3 /// 跟普通方法没有区别 4 /// </summary> 5 private static async void NoReturnNoAwait() 6 { 7 // 主线程执行 8 Console.WriteLine($ " NoReturnNoAwait Sleep before Task,ThreadId={Thread.CurrentThread.ManagedThreadId} " ); 9 Task task = Task.Run(() => // 启动新线程完成任务 10 { 11 Console.WriteLine($ " NoReturnNoAwait Sleep before,ThreadId={Thread.CurrentThread

多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

不想你离开。 提交于 2020-04-17 16:40:19
原文: 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用 如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让大家眼见为实。 private static IEnumerable<T> QueryImpl<T>( this IDbConnection cnn, CommandDefinition command, Type effectiveType) { object param = command.Parameters; var identity = new Identity(command.CommandText, command.CommandType, cnn, effectiveType, param?.GetType()); var info = GetCacheInfo(identity, param, command.AddToCache); IDbCommand cmd = null; IDataReader reader = null; bool wasClosed = cnn.State == ConnectionState.Closed; try { while (reader.Read

多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

非 Y 不嫁゛ 提交于 2020-04-17 00:00:56
【推荐阅读】微服务还能火多久?>>> 如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让大家眼见为实。 private static IEnumerable<T> QueryImpl<T>(this IDbConnection cnn, CommandDefinition command, Type effectiveType) { object param = command.Parameters; var identity = new Identity(command.CommandText, command.CommandType, cnn, effectiveType, param?.GetType()); var info = GetCacheInfo(identity, param, command.AddToCache); IDbCommand cmd = null; IDataReader reader = null; bool wasClosed = cnn.State == ConnectionState.Closed; try { while (reader.Read()) { object val = func

多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

我是研究僧i 提交于 2020-04-16 22:27:43
【推荐阅读】微服务还能火多久?>>> 如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让大家眼见为实。 private static IEnumerable<T> QueryImpl<T>(this IDbConnection cnn, CommandDefinition command, Type effectiveType) { object param = command.Parameters; var identity = new Identity(command.CommandText, command.CommandType, cnn, effectiveType, param?.GetType()); var info = GetCacheInfo(identity, param, command.AddToCache); IDbCommand cmd = null; IDataReader reader = null; bool wasClosed = cnn.State == ConnectionState.Closed; try { while (reader.Read()) { object val = func