ilspy

对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相

巧了我就是萌 提交于 2021-02-10 06:04:53
一:背景 1. 讲故事 昨天在园里的编辑头条看到 精致码农大佬 写的一篇题为: [C#.NET 拾遗补漏]10:理解 volatile 关键字 (https://www.cnblogs.com/willick/p/13889006.html) 的文章,大概就是说在 多线程环境下,一个在debug不出现,在release中出现的bug,原文代码如下: public class Worker { private bool _shouldStop; public void DoWork ( ) { bool work = false ; // 注意:这里会被编译器优化为 while(true) while (!_shouldStop) { work = !work; // do sth. } Console.WriteLine( "工作线程:正在终止..." ); } public void RequestStop ( ) { _shouldStop = true ; } } public class Program { public static void Main ( ) { var worker = new Worker(); Console.WriteLine( "主线程:启动工作线程..." ); var workerTask = Task.Run(worker.DoWork)

反编译之混淆

て烟熏妆下的殇ゞ 提交于 2020-11-04 06:04:16
一 、 反编译原理是什么? C++ 、 C 语言一般不能反编译为源代码,只能反编译为 asm (汇编)语言,因为 C 较为底层,编译之后不保留任何元信息,而计算机运行的二进制实际上就代表了汇编指令,所以反编译为汇编是较为简单的。 C# 、 Java 这类高级语言,尤其是需要运行环境的语言,如果没有混淆,非常容易反编译。原因很简单,这类语言只会编译为中间语言( C# 为 MSIL 微软中间语言, Java 为 Bytecode 字节码),而中间语言与原语言本身较为相似,加上保留的元信息(记录类名、成员函数等信息)就可以反向生成源代码,注意是由反编译器生成,不会与源码完全相同,但可以编译通过。这些特性本身是为反射技术准备的,却被反编译器利用,现在的 C# 反编译器 IL Spy 甚至可以反向工程。 二、 C# 反编译破解工具 常用两种: .NET Reflector 和 ILSyp 工具。 三、 C# 反编译防范措施: ① 设置项目代码反汇编属性(弊大于利,不推荐使用,具体用法:https://www.cnblogs.com/caokai520/p/7711136.html) ② 混淆(重点讲解) 四 、 混淆代码对比 未使用混淆工具,反编译出的源码: 使用混淆工具,反编译出的源码: 优点:效果很明显, C# 代码通过混淆工具生成后,增加了很多转换过程。这使得

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

流过昼夜 提交于 2020-10-22 23:26:22
一:背景 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

12个Visual Studio调试效率技巧

泪湿孤枕 提交于 2020-10-06 03:13:12
在这篇文章中,我们假定读者了解 VS 基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果当前程序指针指向一个函数) F10 步过函数(如果当前程序指针指向一个函数) Shift+F11 步出执行的函数 暂停执行 附加到进程 鼠标悬停时快速查看源代码中的元素 调试窗口:局部变量、监视、即时窗口、模块、调用堆栈、异常设置 许多开发人员使用这个功能强大的工具包来处理调试会话。然而, Visual Studio 调试工具提供了更多的功能。下面是一系列Visual Studio调试效率技巧。注意,这些提示和快捷方式已经在的Visual studio 2019 16.6 EN-US版本中进行了验证,验证时 Visual studio 没有安装扩展。 1、运行到光标位置 使用快捷键 Ctrl+F10 ,您可以让调试器运行到光标所在行位置。 2、通过点击鼠标,运行到当前位置 在调试运行的程序时,通过鼠标悬停在当前行的代码上时,出现绿色的符号,可以点击此符号,直接让断点运行到此处。 3、在此处作为下一条要执行的语句 在调试运行的程序时,通过鼠标悬停在当前行的代码上时,通过按住 Ctrl 键转换为将此处作为下一条要执行的语句。它与通过绿色箭头符号运行到这里不同,此功能将会跳过中间的语句

await,async 我要把它翻个底朝天,这回你总该明白了吧

半世苍凉 提交于 2020-09-27 18:04:57
一:背景 1. 讲故事 await,async 这玩意的知识点已经被人说的烂的不能再烂了,看似没什么好说的,但我发现有不少文章还是从理论上讲述了这两个语法糖的用法,懂得还是懂,不懂的看似懂了过几天又不懂了,人生如戏全靠记是不行的哈😄😄😄,其实本质上来说 await, async 只是编译器层面上的语法糖,在 IL 层面都会被打成原型的,所以在这个层面上认识这两个语法糖是非常有必要的。 二:从 IL 层面认识 1. 使用 WebClient 下载 为了方便打回原型,我先上一个例子,使用 webclient 异步下载 http://cnblogs.com 的html,代码如下: class Program { static void Main(string[] args) { var html = GetResult(); Console.WriteLine("稍等... 正在下载 cnblogs -> html \r\n"); var content = html.Result; Console.WriteLine(content); } static async Task<string> GetResult() { var client = new WebClient(); var content = await client.DownloadStringTaskAsync(new

ASP.NET Core Blazor Webassembly 之 组件

ⅰ亾dé卋堺 提交于 2020-09-24 13:30:44
关于组件 现在前端几大轮子全面组件化。组件让我们可以对常用的功能进行封装,以便复用。组件这东西对于搞.NET的同学其实并不陌生,以前ASP.NET WebForm的用户控件其实也是一种组件。它封装html代码,封装业务逻辑,对外提供属性事件等信息,它完完全全就是个组件,只是用户控件跑在服务端,而现在的组件大多数直接跑在前端。现在Blazor Webassembly微软正式把组件带到前端,让我们看看它是怎么玩的。 第一个组件 废话不多说下面开始构建第一个组件。这个组件很简单就是绿色的面板加一个标题的容器,我们就叫它GreenPanel吧。 新建Blazor Webassembly项目 前几天的build大会,Blazor Webassembly已经正式release了。我们更新最新版的Core SDK就会安装正式版的模板。 新建项目选Blazor Webassembly App项目模板 新建GreenPanel组件 在pages命令下新建一个文件夹叫做components,在文件夹下新建一个razor组件,命名为GreenPanel.razor。 注意:组件的命名必须大写字母开头 添加代码如下: <div class="green-panel"> <div class="title"> Green panel </div> <div class="content"> </div> <

C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!(应该是全网第一篇)

谁说我不能喝 提交于 2020-08-18 14:41:01
一:背景 1. 讲故事 好消息, .NET 5.0 终于在2020年6月10日发布了第五个预览版,眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0 ,此处有掌声,太好了!!! .Net5官方链接 可以看到目前的C#9还是预览版,实现了一部分新语法供开发者提前尝鲜,从github的roslyn仓库上可以看到目前准备实现 17 个新特性,现阶段已经实现了 8 个,其中的 In Progress 表示正在开发中。 新特性预览 2. 安装必备 下载最新的 net5 sdk 吧: dotnet-sdk-5.0.100-preview.5.20279.10-win-x64.exe 下载最新的 visual studio 2019 preview 2 找好你自己的vs版本类型哦。。。 二:新特性研究 1. Target-typed new 这个取名一定要留给学易经的大师傅,没见过世面的我不敢造次,取得不佳影响时运,所谓 运去金成铁, 时来铁似金 ,不过大概意思就是说直接new你定义的局部变量的类型,用 issues 中总结的话就是: Summary: Allow Point p = new (x, y); Shipped in preview in 16.7p1. 接下来就是全部代码,看看 使用前 和 使用后 的具体差别。 class Program { static void Main

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

空扰寡人 提交于 2020-08-16 07:42:49
一:背景 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 了,到处都充斥着语法糖

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

我怕爱的太早我们不能终老 提交于 2020-08-16 04:49:12
一:背景 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 了,到处都充斥着语法糖

unity PC端发布的exe包反编译提取代码

北慕城南 提交于 2020-08-15 11:01:41
安装dll反编译软件, Reflector 或 ILSpy 都行 这次发现,通过 ILSpy 反编译的代码比较接近源文件,但是和源文件相比较还是有稍微的改动 将需要反编译的dll文件拖到反编译软件中即可 FR:徐海涛(hunk Xu) QQ技术交流群:386476712 来源: oschina 链接: https://my.oschina.net/u/4357160/blog/4496621