ilspy

foreach 集合又抛经典异常了,这次一定要刨根问底

时光怂恿深爱的人放手 提交于 2020-08-15 01:08:39
一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报: 集合已修改;可能无法执行枚举操作 ,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员几乎都遇到过,谁也不是一生下就是大牛,简单看了下代码,确实是多线程操作foreach,但并没有对foreach进行Add,Remove操作,扫完代码其实我也是有点懵,没撤只能调试了,在foreach里套一层trycatch,查看异常的线程堆栈从而找出了问题代码,代码简化如下: static void Main(string[] args) { var dict = new Dictionary<int, int>() { [1001] = 1, [1002] = 10, [1003] = 20 }; foreach (var userid in dict.Keys) { dict[userid] = dict[userid] + 1; } } 先寻找点安慰,说实话,凭肉眼你觉得这段代码会抛出异常吗? 反正我是被骗过了,大写的尴尬,结论如下,运行一下便知。 从图中看确实是异常,说明在foreach的过程中连迭代集合的 value 都不可以修改,这让我激起了强烈的探索欲,看看FCL中到底是怎么限制的。 二:源码探索 1. 从IL中寻找答案 C#已发展到 9.0 了,到处都充斥着语法糖

配置文件中的数据库连接串加密了,你以为我就挖不出来吗?

让人想犯罪 __ 提交于 2020-08-12 10:45:43
一:背景 1. 讲故事 前几天在调试物联柜终端上的一个bug时发现 app.config 中的数据库连接串是加密的,因为调试中要切换数据库,我需要将密文放到专门的小工具上解密,改完连接串上的数据库名,还得再加密贴到 app.config 中,烦的要死,内容如下: <appSettings> <!-- 数据库连接字符串 --> <add key="OLEDBConnStr" value="XfES27am6Muw48iB1GlMVqvUbq7/Pp9n4XbZJsDu19YDr/Zdb3m7KT6haD7f9HLj/ZEvIiZbmSU4O5L9g03Y5IUB6KLCZI7s3nDLwTIC+bXLf5quu/r8ZAI+rgNnsNZdwoDfquRLQy5Cf2X8/MFDOcMNaZYMpTYeHsZoEERU/TP9t3n5QllJTihrmDFbiGHLqe1kfN3uB3g1kgs0oobIEfNPr09kQ/pFgzZi/kZCrK10PLZZ0pFj1YU5ReFqBsdBlecV3D2Zl3lx1Ibls24t7w==" /> </appSettings> 改完bug之后,我就想这玩意能防的了谁呢? 私以为搞这么麻烦也就防防君子,像我这样的 晓人 ,加不加密都是等于没加密,照样给你脱库。。。😄😄😄 二:使用 ILSpy 去脱库 1. 从DAL

C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法

余生长醉 提交于 2020-08-11 18:34:13
一:背景 1. 讲故事 上一篇跟大家聊到了 Target-typed new 和 Lambda discard parameters ,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多头还是空头,起码还是对它抱有一种极为关注的态度,所以我的这个系列还得跟,那就继续开撸吧,今天继续带来两个新特性,更多新特性列表,请大家关注: 新特性预览 二:新特性研究 1. Native ints 从字面上看貌似是什么原生类型ints,有点莫名其妙,还是看一看 Issues 上举得例子吧: Summary: nint i = 1; and nuint i2 = 2; Shipped in preview in 16.7p1. 有点意思,还是第一次看到有nint这么个东西,应该就是C#9新增的关键词,好奇心爆棚,快来实操一下。 static void Main(string[] args) { nint i = 10; Console.WriteLine($"i={i}"); } 从图中看,可以原样输出,然后用ILSpy查查底层IL代码,发现连IL代码都不用看😁😁😁。如下图: 从图中看原来nint就是 IntPtr 结构体哈,如果你玩过 C# 到 C++ 之间的互操作,我相信你会对Ptr再熟悉不过了,从这个 nint 上看,<font color="red">你不觉得C

ASP.Net Core Web Api 使用 IdentityServer4 最新版 踩坑记录

故事扮演 提交于 2020-08-11 07:53:02
辅助工具 日志追踪包 : Serilog.AspNetCore 源码查看工具 : ILSpy 项目环境 ###: ASP.NetCore 3.1 IdentityServer4 4.0.0+ 主题内容 测试登录方式 : password 错误内容: connect/token 登陆出错 但百度/google网上的示例没有找到正确的调用方式,无奈只能自己动手,丰衣足食... 首先,先按照之前版本进行传参 POST请求 url: connect/token 参数传递通过 form-data 调用结果: <调用结果> HTTP : 400 { "error": "invalid_request" } 查找调用日志 Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token 可以看到地址匹配是成功的,那就是校验不通过了,接着看一下这个类的源码,找到错误触发地 public async Task<IEndpointResult> ProcessAsync(HttpContext context) { if (!HttpMethods.IsPost(context.Request.Method) || !context.Request

List的扩容机制,你真的明白吗?

丶灬走出姿态 提交于 2020-08-11 00:58:49
一:背景 1. 讲故事 在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔。 为了方便讲述,我准备从List说起,因为它最简单哈😁😁😁 二:List扩容机制 1. 如何查看 要想看它的扩容机制,可以用ILSpy去看看List的源码即可,非常简单。 从源码的 int num = (_items.Length == 0) ? 4 : (_items.Length * 2) 可以非常清楚的看到,4个空间起步,后面都是 *2 的扩容,也就说当你有 2^(n-1) + 1 个元素,实际上你需要占用 2^n 个空间。 下面我用C#代码演示一下: static void Main(string[] args) { var list1 = Enumerable.Range(0, (int)Math.Pow(2, 22)).ToList(); var list2 = new List<int>(list1); list2.Add(1); Console.WriteLine($"list1.Capacity={list1.Capacity}"); Console.WriteLine($"list2

还不明白可空类型原理? 我可要挖到底了

对着背影说爱祢 提交于 2020-07-28 18:57:49
一:背景 1. 讲故事 下决心做好自媒体到现在有一个月了,关注我的兄弟应该知道我产出了不少文章,号里的粉丝也多起来了,我也尽最大努力做到有问必回,现在是基础的、高深的问题都接踵而来,可我也只是一只小菜鸟,想飞也飞不动了(┬_┬),昨天号里有位朋友被面试官问到可空类型的原理,回答的不好,面试官也是,面就面呗,又给不了多少银子,还动不动就原理,哪有那么多原理,搞得双方都尴尬😄😄😄。 二:给我锄头我要挖到底 这种问题要怎么挖呢? 我在之前的文章也聊过,C#代码到机器码中间有两个编译过程,一个是csc编译后的IL代码,一个是jit编译后的native代码,所以搞懂IL代码和native代码就是我们要深究的方向,我还是把那篇文章的图拿过来。 为了方便演示,我就定义一个 int? 类型,接收非null和null两种情况。 static void Main(string[] args) { int? num1 = 10; int? num2 = null; Console.WriteLine("执行结束啦!"); Console.ReadLine(); } 1. 挖IL代码 挖IL代码简单,用ILSPY小工具就可以了,编译后生成的IL代码如下: .method private hidebysig static void Main ( string[] args ) cil managed { /

C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

荒凉一梦 提交于 2020-07-27 22:29:13
一:背景 1. 讲故事 .NET 5 终于在 6月25日 发布了第六个预览版,随之而来的是更多的新特性加入到了 C# 9 Preview 中,这个系列也可以继续往下写了,废话不多说,今天来看一下 Top-level programs 和 Extending Partial Methods 两大新特性。 2. 安装必备 下载最新的 .net 5 preview 6 。 下载最新的 Visual Studio 2019 version 16.7 Preview 3.1 二:新特性研究 1. Top-level programs 如果大家玩过 python,应该知道在 xxx.py 中写一句 print,这程序就能跑起来了,简单高效又粗暴,很开心的是这特性被带到了C# 9.0 中。 修改前 using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } 修改后 System.Console.WriteLine("Hello World!"); 这就有意思了,Main入口函数去哪了? 没它的话,JIT还怎么编译代码呢? 想知道答案的话用 ILSpy 反编译看一下就好啦! .class private

List的扩容机制,你真的明白吗?

大城市里の小女人 提交于 2020-07-27 21:56:32
一:背景 1. 讲故事 在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到几百万甚至千万的大集合这个扩容机制还真的需要挖一下,免的入戏太深,难以自拔。 为了方便讲述,我准备从List说起,因为它最简单哈😁😁😁 二:List扩容机制 1. 如何查看 要想看它的扩容机制,可以用ILSpy去看看List的源码即可,非常简单。 从源码的 int num = (_items.Length == 0) ? 4 : (_items.Length * 2) 可以非常清楚的看到,4个空间起步,后面都是 *2 的扩容,也就说当你有 2^(n-1) + 1 个元素,实际上你需要占用 2^n 个空间。 下面我用C#代码演示一下: static void Main(string[] args) { var list1 = Enumerable.Range(0, (int)Math.Pow(2, 22)).ToList(); var list2 = new List<int>(list1); list2.Add(1); Console.WriteLine($"list1.Capacity={list1.Capacity}"); Console.WriteLine($"list2

Can .Net Core 3 self-contained single executable be decompiled?

£可爱£侵袭症+ 提交于 2020-05-31 07:42:40
问题 I tried using Dotpeek and ILSpy.Net to decompile (my own code), they failed. Do I need special obfuscation on distributed binaries of .Net Core 3 self-contained single executable ? <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <PublishTrimmed>true</PublishTrimmed> <PublishReadyToRun>true</PublishReadyToRun> <PublishSingleFile>true</PublishSingleFile> <RuntimeIdentifier>win-x64</RuntimeIdentifier> </PropertyGroup

Can .Net Core 3 self-contained single executable be decompiled?

老子叫甜甜 提交于 2020-05-31 07:42:26
问题 I tried using Dotpeek and ILSpy.Net to decompile (my own code), they failed. Do I need special obfuscation on distributed binaries of .Net Core 3 self-contained single executable ? <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <PublishTrimmed>true</PublishTrimmed> <PublishReadyToRun>true</PublishReadyToRun> <PublishSingleFile>true</PublishSingleFile> <RuntimeIdentifier>win-x64</RuntimeIdentifier> </PropertyGroup