摘要: dnSpy 是 0xd4d 开发的 .NET 程序调试神器。 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程序。 如果你发现本文原本应该有图的地方却没有看到图片,那可能是被某种特殊的网络屏蔽了。请移步至 神器 阅读全文
posted @ 2018-05-25 21:32 walterlv 阅读(1669) 评论(0) 推荐(0) 编辑
摘要: C# 中的操作符重载并不新鲜。然而,到底有哪些操作符可以重载,重载操作符可以用来做哪些丧心病狂的事情呢? 本文收集了 C# 中所有可以重载的操作符,并且利用他们做了一些丧心病狂的语法糖。 可以重载的操作符 操作符的重载比想象中的更加强大。因为——重载操作符时可以随意定义操作符中操作数的数据类型和返回 阅读全文
posted @ 2018-05-25 21:28 walterlv 阅读(529) 评论(0) 推荐(0) 编辑
摘要: 如果你干预到了项目的编译过程,可能就需要考虑到差量编译了。不然——当你的项目大起来的时候,就会感受到每次都重新编译时,每次重复调试的过程都要进行漫长等待时的绝望和无奈。如果你正遭遇差量编译失效,每次都要重新编译的问题,那么阅读本文应该能够帮助你解决问题。ms... 阅读全文
posted @ 2018-05-19 08:13 walterlv 阅读(335) 评论(0) 推荐(1) 编辑
摘要: 最近我将项目格式进行了升级,从旧的 csproj 升级成了新的 csproj;NuGet 包管理的方式也从 packages.config 升级成了 PackageReference。然而迁移完才发现,这个项目竟然还依赖了大量的从 NuGet 2.x 时代发布的 NuGet 包,这些包并不能在 Pa 阅读全文
posted @ 2018-05-19 08:12 walterlv 阅读(426) 评论(0) 推荐(0) 编辑
摘要: MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性,它使得我们可以用 C# 语言编写扩展;利用这种扩展性,我们可以为我们的项目定制一部分的编译细节。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还... 阅读全文
posted @ 2018-05-19 08:11 walterlv 阅读(435) 评论(1) 推荐(0) 编辑
摘要: 命令行可是跨进程通信的一种非常方便的手段呢,只需启动一个进程传入一些参数即可完成一些很复杂的任务。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NET 的包平台;我们可以利用 NuGet 发布我们的工具并自动启用这样的工具。 制作这样的一个跨平台 阅读全文
posted @ 2018-05-19 08:05 walterlv 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 写了这么多个 C# 项目,是否对项目文件 csproj 有一些了解呢?Visual Studio 是怎么让 csproj 中的内容正确显示出来的呢?更深入的,我能够自己扩展 csproj 的功能吗? 本文将直接从 csproj 文件格式的本质来看以上这些问题。 阅读本文,你将: 可以通读 cspro 阅读全文
posted @ 2018-05-19 07:58 walterlv 阅读(10818) 评论(1) 推荐(8) 编辑
摘要: 知道了 csproj 文件中的一些常用 NuGet 属性,创建 NuGet 包时就可以充分发挥新 Sdk 自动生成 NuGet 包的优势,不需要 nuspec 文件啦。(毕竟 nuspec 文件没有 .csproj 和 .targets 文件强大而又有扩展性。) “项目文件中的已知属性系列”分为两个 阅读全文
posted @ 2018-05-19 07:55 walterlv 阅读(771) 评论(0) 推荐(0) 编辑
摘要: 由于 git rebase 命令的存在,强制将提交推送到远端仓库似乎也有些必要。不过都知道 git push --force 是不安全的,这让 git rebase 命令显得有些鸡肋。 本文将推荐 --force-with-lease 参数,让我们可以更安全地进行强制推送。 --force-with 阅读全文
posted @ 2018-05-19 07:54 walterlv 阅读(6145) 评论(0) 推荐(0) 编辑
摘要: 只要你用 XAML 写代码,我敢打赌你一定用各种方式使(nuè)用(dài)过 Grid。不知你有没有在此过程中看到过 Grid 那些匪夷所思的布局结果呢? 本文将带你来看看 Grid 布局中的 Bug。 无限空间下的比例 先上一段代码,直接复制到你的试验项目中运行: 第一列固定 100,第二列占 阅读全文
posted @ 2018-05-19 07:51 walterlv 阅读(273) 评论(0) 推荐(1) 编辑
摘要: 竟然有小伙伴喜欢在编写代码时使用随机字符当作类名、方法名、变量名,例如这一篇博客里的代码:使用 Resharper 特性 - 林德熙。既然随机,那也随机得像一些啊!于是我改进了标识符的随机算法,使得生成的标识符更像真实单词的组合。 看看标识符的生成效果吧!0、2、4……行是 PascalCase,即 阅读全文
posted @ 2018-04-27 07:20 walterlv 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧样式的 csproj 文件迁移成新样式的 csproj 文件,不过全过程是手工进行的,而且到最后处理 XAML 问题也非常头疼。 现在,我们可以利用工具自动地完成这个过程。当然,工具并不将 csproj 格式 阅读全文
posted @ 2018-04-27 07:17 walterlv 阅读(1328) 评论(0) 推荐(0) 编辑
摘要: .NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力。利用这项能力,我们能够在运行时生成一段代码/一个方法/一个类/一个程序集。 大家都知道反射的性能很差,通过缓存反射调用的方法则能够大幅提升性能。Emit 阅读全文
posted @ 2018-04-27 07:14 walterlv 阅读(545) 评论(0) 推荐(0) 编辑
摘要: .NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力。利用这项能力,我们能够在运行时生成一段代码/一个方法/一个类/一个程序集。 本文将介绍使用 Emit 生成 IL 代码的方法,以及在此过程中可能遇到的各 阅读全文
posted @ 2018-04-27 07:10 walterlv 阅读(733) 评论(0) 推荐(0) 编辑
摘要: 在 Windows 10.0.16299 中,RevealBrush 被引入,可以实现炫酷的鼠标滑过高亮效果和点击光照。本文将告诉大家如何完整地实现这样的效果。 Reveal 的效果(自带) 在微软官方推荐的 XAML Controls Gallery 应用中,我们可以找到 Reveal 的实现章节 阅读全文
posted @ 2018-04-15 10:42 walterlv 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 我们在之前谈过 语义版本号(Semantic Versioning),在项目中应用语义版本号能够帮助库的开发者在发布包时表明更多的语义信息。这是趋势,从微软的博客 Versioning NuGet packages in a continuous delivery world 三部曲中可以看出,从 阅读全文
posted @ 2018-04-15 10:39 walterlv 阅读(2342) 评论(0) 推荐(0) 编辑
摘要: 版本号格式不陌生吧,.NET 传统的版本号格式类似这样 1.5.1254.0。本文将推荐一种新的版本号格式——语义版本号,格式类似这样 1.4.6-beta。我推荐语义版本号是因为这样的版本号自包含语义,而且这样的语义能够在版本库中体现出来。 传统的版本号 如果你只是知道传统版本号由四个部分组成,那 阅读全文
posted @ 2018-04-15 10:37 walterlv 阅读(1560) 评论(1) 推荐(1) 编辑
摘要: UWP 才能使用的流畅设计效果好惊艳,写新的 UWP 程序可以做出更漂亮的 UI 啦!然而古老的 WPF 项目也想解解馋怎么办? 于是我动手实现了一个! 迫不及待看效果 ▲ 是不是很像 UWP 中的 RevealBorderBrush? 不止是效果像,连 XAML 写法也像: ▲ 模拟得很像的 Re 阅读全文
posted @ 2018-04-05 17:08 walterlv 阅读(540) 评论(0) 推荐(0) 编辑
摘要: 手头的解决方案真大!里面的项目个数达到了 30 个或是 50 个?然而接近一半是单元测试项目和辅助工具。再加上一些不尽如人意的项目优化,编译速度真的是无力吐槽。幸好 Visual Studio 提供了解决方案配置功能,可以让我们在编译时略过一些项目。 在解决方案上右击选择“属性”,我们将打开“解决方 阅读全文
posted @ 2018-04-05 17:07 walterlv 阅读(811) 评论(0) 推荐(0) 编辑
摘要: 在为开源项目 easiwin/MSTestEnhancer 进行持续集成编译时,需要在编译命令中传入较多的参数。这对于新接手此项目的人来说,成本还是高了一点儿。本文将介绍 MSBuild 响应文件 (MSBuild Response Files, *.rsp) 来优化命令行编译体验。 我们在 msb 阅读全文
posted @ 2018-04-05 17:06 walterlv 阅读(626) 评论(0) 推荐(0) 编辑
摘要: 注意到每次编译完之后,你的 dll 或者 exe 是不一样的吗?本来这并没有什么大不了的,但大家都知道数字和鹅厂的安全软件遍布在我们大(tiān)陆(cháo)地区的大量电脑上,它们的查杀策略是——凡是不认识的一律是病毒木马;于是每次不一样的编译很容易引起它们的警告——真不想每次都把编译后的样本提交 阅读全文
posted @ 2018-03-31 17:23 walterlv 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 通过 mklink 命令可以创建文件或文件夹的链接,而这种链接跟快捷方式是不一样的。然而我们还可能会遇到其使用过程中的一些坑,本文将整理这些坑并提供解决方法。 0x00 背景介绍:mklink mklink 可以像创建快捷方式一样建立文件或文件夹的链接,但不同于快捷方式的是,mklink 创建的链接 阅读全文
posted @ 2018-03-31 17:01 walterlv 阅读(5414) 评论(0) 推荐(0) 编辑
摘要: if (this == null) Console.WriteLine("this is null"); 这句话一写,大家一定觉得荒谬,然而 if 内代码的执行却是可能的!本文讲介绍到底发生了什么。 制造一个 this 可以为 null 的程序 请看代码,这是我们的库函数: 外面是这样调用的: 这代 阅读全文
posted @ 2018-03-31 08:41 walterlv 阅读(615) 评论(0) 推荐(0) 编辑
摘要: 我在 使用 Task.Wait()?立刻死锁(deadlock) 一文中站在类库使用者的角度看 async/await 代码的死锁问题;而本文将站在类库设计者的角度来看死锁问题。 阅读本文,我们将知道如何编写类库代码,来尽可能避免类库使用者出现那篇博客中描述的死锁问题。 可能死锁的代码 现在,我们是 阅读全文
posted @ 2018-03-23 22:01 walterlv 阅读(541) 评论(0) 推荐(0) 编辑
摘要: 多人协作开发的项目总会遇到代码编写风格上的差异。一般工具都能帮我们将常见的差异统一起来——例如 if 的换行;但也有一些不那么通用,但项目中却经常会出现的写法也需要统一。 例如将单元测试中的 Assert.AreEqual(foo.GetType(), typeof(Foo)); 换成 Assert 阅读全文
posted @ 2018-03-20 20:35 walterlv 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 使用 Visual Studio 提供的 Syntax Visualizer,我们可以实时看到一个代码文件中的语法树。这对我们基于 Roslyn 编写静态分析和修改工具非常有帮助。本文将介绍如何安装它和使用它。 这里是 Visual Studio 的语法可视化(Syntax Visualizer): 阅读全文
posted @ 2018-03-19 19:51 walterlv 阅读(399) 评论(0) 推荐(0) 编辑
摘要: Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的项目文件。 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 Roslyn 扩展项目,如何开始分析一个解决方案(.sln)中项目(.csproj)的代码文件(.cs 阅读全文
posted @ 2018-03-19 19:49 walterlv 阅读(627) 评论(1) 推荐(1) 编辑
摘要: 为什么屏幕上出现了一个灰框,里面有黑色数字,而且还不消失?强迫症难以忍受啊! ▲ 就是这个置于所有窗口最顶层,怎么也去不掉的灰色数字框 强迫症晚期请直接前往最后一节把它消灭好了,非强迫症晚期的我们一起来探究下它到底是什么。 使用 Spy++ 想探究一个界面属于哪个进程,当然少不了 Spy++。现在, 阅读全文
posted @ 2018-03-19 19:48 walterlv 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 在 async/await 异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async/await 可能有些困难。这里就免不了将一部分异步代码修改为同步代码。然而传统的迁移方式存在或多或少的问题 阅读全文
posted @ 2018-03-19 19:47 walterlv 阅读(324) 评论(2) 推荐(0) 编辑
摘要: 命令“”xxx.exe” xxx”已退出,代码为 n。 我们在 cmd 中输入常见命令的时候,如果命令输入错误或使用错误,cmd 中会提示错误原因,帮助我们定位并解决问题。然而如果相同的命令放到了 Visual Studio 的生成事件中,我们就只能得到 Visual Studio 返回的错误代码了 阅读全文
posted @ 2018-03-19 19:43 walterlv 阅读(531) 评论(0) 推荐(0) 编辑