取消

每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译

如果你干预到了项目的编译过程,可能就需要考虑到差量编译了。不然——当你的项目大起来的时候,就会感受到每次都重新编译时,每次重复调试的过程都要进行漫长等待时的绝望和无奈。 如果你正遭遇差量编译失效,每次都要重新编译的问题,那么阅读本文应该能够帮助你解决问题。 msbuild.exe 和 dotnet build 编译项目的方式是一样的,只不过前者使用完整的 .NET Framework...

像黑客一样!Chrome 完全键盘操作指南(原生快捷键 + Vimium 插件)

有那么一波小伙伴,多数时候都不需要用到鼠标,通常他们正好是“黑客”。当你开始使用键盘操作一切时,便能体会到无需用鼠标瞄准按钮时的干脆,无需在键盘和鼠标之间移动手时的轻松。 Chrome 原生自带大量快捷键,Vimium 在原生的基础上又增加了大量网页操作。结合两者,你完全能摆脱鼠标。 Chrome 原生快捷键 Chrome 原生快捷键估计多数人都能说出其中的一部分出来,例如 F...

.NET/C# 使用 Span 为字符串处理提升性能

.NET Core 2.1 和 C# 7.2 带来了 Span 的原生支持,原本需要使用不安全代码操作的内存块现在可以使用安全的方式来完成。此前在性能和稳定性上需要有所取舍,而现在可以兼得了。 简单的例子 先来看一个字符串处理时使用 Span<T> 的最简单的例子: using System; using System.Text; namespace Walter...

使用 PInvoke.net Visual Studio Extension 辅助编写 Win32 函数签名

在 .NET 程序中使用 Win32 函数并不如 C++ 中方便。因为 C# 中不能引入 C++ 中常用的头文件,于是各种方法签名、结构体定义等等都需要各种寻找。然而 PInvoke.net 帮助我们解决了这个问题。本文推荐一款 Visual Studio 插件来帮助我们更快速地插入 Win32 函数签名。 PInvoke.net PInvoke.net 的官方网站是 https...

使用 IFTTT 做 RSS 的邮件订阅服务

IFTTT 是一个奇特的网络服务。它本身没有提供什么功能,但因为它的工作方式类似编程,所以你可以拿它做各种各样难以想象的事情。 本文将使用 IFTTT 做一个 RSS 的邮件订阅服务。 IFTTT IFTTT 这种神奇的名字还是需要介绍一下的 —— 读作 [ɪft],意思是 If This Then That。 直接翻译,是“如果这个,那就那个”。这其实挺有趣的,因为这就像编...

理解 Roslyn 中的红绿树(Red-Green Trees)

Roslyn 的 API 是非常易用的。即便如此复杂的 C# 语法,建立的复杂的 C# 语法树,还有其复杂的树遍历和修改过程,也都被其 API 包装得干净简洁。 而这背后是它的重要设计思路 —— 红绿树。 红绿树的影子 如果你是通过搜索找到这篇文章的,那么至少证明你调试过 Roslyn API 的使用,或者阅读过 Roslyn 的源码。因为正常使用 Roslyn 的 API 时...

Roslyn 语法树中的各种语法节点及每个节点的含义

使用 Roslyn 进行源码分析时,我们会对很多不同种类的语法节点进行分析。如果能够一次性了解到各种不同种类的语法节点,并明白其含义和结构,那么在源码分析的过程中将会更加得心应手。 本文将介绍 Roslyn 中各种不同的语法节点、每个节点的含义,以及这些节点之间的关系和语法树结构。 基本概念 using System; namespace Walterlv.Demo { ...

.NET Standard 的管理策略

.NET Standard 作为各大 .NET 的标准,我们有必要了解一下它是如何在各种 .NET 的实现之间履行自己的职责的。所以,本文会说说它的管理策略。 都有哪些 .NET Standard 的实现? 目前 .NET Standard 的实现有这些: .NET Core .NET Framework Mono Unity Xamarin 标准在前...

在 Visual Studio 的解决方案资源管理器中隐藏一些文件

项目文件中有一些属性几乎是专门为 IDE 而准备的,不过考虑到 .NET 生态的开发者多数都使用 Visual Studio,所以基本上也只有 Visual Studio 对这些特性支持的最全面。(才不会透漏这些属性其实本就是为 Visual Studio 而准备的呢。) 本文将介绍如何在 Visual Studio 的解决方案资源管理器中隐藏一些文件。 原生支持 Visual...

如何在 MSBuild Target(Exec)中报告编译错误和编译警告

我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程。但是,相比于 基于 Task 的方式,可控制的因素还是太少了。 有没有什么办法能够让控制台程序也能与 MSBuild Target 之间发生更多的信息交换呢?比如报告编译错误和编译警告?答案是有的,通过格式化控制台输出。 编译错误和编译警告 MSBuild 的 E...

语义耦合(Semantic Coupling)

跟小伙伴一起重构一段 UI,试图将用户界面和业务代码分离的时候,小伙伴试图在业务代码中直接调用 UI。我们当然都知道这会产生耦合,于是小伙伴试图定义一些属性、变量或接口来解决这个耦合。虽然在代码的静态分析中,这一的耦合消失了,但我始终觉得不妥。觉得耦合依然存在,只是不再能被静态分析了。 我想到一个词——“语义耦合(Semantic Coupling)”,搜索发现也有很多小伙伴在关心这个问题...

XML 的 XPath 语法

XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言。无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件。 本文将介绍 XPath 的一些语法。 本文读写的 XML 文件会以 文章末尾的代码 - 假设的 XML 文件 作为示例。 XPath 被称作 XML 路径语言,正出自于其最重要的 —— 路径...

UWP 将图片裁剪成圆形(椭圆)

不知从什么时候开始,头像流行使用圆形了,于是各个平台开始追逐显示圆形裁剪图像的技术。UWP 有内建的机制支持这种圆形图像裁剪,不过,仅限于画刷。 WPF 的圆形裁剪请左转参考:WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)。 与 WPF 不同,UWP 中 UIElement.Clip 属性是 RectangleGeometry 类型的,这意味着利用此属性是没有办法...

C#/.NET 中推荐的 Dispose 模式的实现

如果你觉得你的类需要实现 IDisposable 接口,还是需要注意一些坑的。不过前人准备了 Dispose 模式 供我们参考,最大程度避免这样的坑。 C#程序中的 Dispose 方法,一旦被调用了该方法的对象,虽然还没有垃圾回收,但实际上已经不能再使用了。所以使用上要仔细考虑细节。 需要明确一下 C# 程序(或者说 .NET)中的资源。简单的说来,C# 中的每一个类型都代表一种资...

文件被占用?系统自带的“资源监视器(resmon)”也能帮你找到占用它的真凶

文件或文件夹被占用,然后无法删除?这真的很恼人。关键是还不知道究竟是哪个程序占用的,想退出都不行。 有各种工具解决此问题,平时下载屯着他们能够省下不少事儿。如果突然间情况非常紧急怎么办?学会使用本文介绍的系统自带工具“资源监视器”,也能立即着手找到真凶! 删除拒绝提示: ▲ 文件夹访问被拒绝 1 即便点了继续,依然拒绝: ▲ 文件夹访问被拒绝 2 现在,去搜索框(小娜)中...

神器如 dnSpy,无需源码也能修改 .NET 程序

dnSpy 是 0xd4d 开发的 .NET 程序调试神器。 说它是神器真的毫不为过!它能在完全没有源码的情况下即时调试程序,甚至还能修改程序!本文讲向大家介绍如何使用 dnSpy 修改 .NET 程序。 dnSpy 的主打功能是无需源码的调试,林德熙 有一篇文章 断点调试 Windows 源代码 介绍了这个方法。而本文主要说其另一项强大的功能 —— 修改程序集。 看看 dnS...

推荐近乎免费的调试神器——OzCode

当一只断点打在 Visual Studio 的代码编辑器中,程序命中断点的那一刻,调试才刚刚开始……这个时候忙碌的手在键盘和鼠标之间来回跳跃,试图抓住每一次单步执行带来的状态改变。 如果命中断点的那一刻多数我需要的状态都自动呈现,偶尔需要的状态能够快速定位,那该多好!于是,有了 OzCode…… OzCode 的官网在这里:OzCode: Innovative debugging e...

Grid 布局算法!自己动手实现一个 Grid

Avalonia 是一款尚在开发中的基于 .NET Core 的跨平台 UI 框架。目前用在个人项目中还是不错的,不过还需要大家在开源社区中多多支持。 我为它写了一个全新的 Grid 布局算法,此算法是 WPF 在通常情况下的性能的两倍。本文将分享我在此项目中实现的算法的原理。 Grid 的布局行为到底是怎样的? Grid 算是 WPF/UWP 入门中非常重要的一个布局容器了。...

安利一款非常好用的命令行参数库:McMaster.Extensions.CommandLineUtils

命令行参数解析想必是每一个命令行程序都难以避开的工程。这工程可小可大,但每次都写始终是在浪费时间。而且,不同人实现也千差万别,使得不同的命令行程序命令参数传入的体验总有差异。 于是安利一款命令行工具库——McMaster.Extensions.CommandLineUtils,它符合当下各大主流命令行工具的参数体验;而且,代码非常简洁。 更新: 如果你之前阅读过我这篇博客,可能知道...

冷算法:自动生成代码标识符(类名、方法名、变量名)

竟然有小伙伴喜欢在编写代码时使用随机字符当作类名、方法名、变量名,例如这一篇博客里的代码:使用 Resharper 特性 - 林德熙。既然随机,那也随机得像一些啊!于是我改进了标识符的随机算法,使得生成的标识符更像真实单词的组合。 看看标识符的生成效果吧!0、2、4……行是 PascalCase,即首字母大写的;1、3、5……行是 camelCase 即首字母小写的。 ▲ 是不是感...

利用 TypeConverter,转换字符串和各种类型只需写一个函数

本文代码基于 .NET Framework 实现。 本来只想进行简单的配置存储的,不料发现 .NET 的基本类型多达十多种。于是,如果写成下面这样,那代码可就太多了哦: // 注:`Configurator`是我的配置类,用于读写字符串的。 public static int GetInt32(this Configurator config, string key) { r...

命令“"xxx.exe" xxx”已退出,代码为 3/123/9009。VS 的这些编译错误代码代表了什么意思?

我们在 cmd 中输入常见命令的时候,如果命令输入错误或使用错误,cmd 中会提示错误原因,帮助我们定位并解决问题。然而如果相同的命令放到了 Visual Studio 的生成事件中,我们就只能得到 Visual Studio 返回的错误代码了。为了能够快速地根据错误代码大致猜测错误原因,本文整理了一部分错误代码的通用原因。 命令“"xxx.exe" xxx”已退出,代码为 n。 ...

VS 编译太慢了吗?新建解决方案配置关闭一部分项目的编译

手头的解决方案真大!里面的项目个数达到了 30 个或是 50 个?然而接近一半是单元测试项目和辅助工具。再加上一些不尽如人意的项目优化,编译速度真的是无力吐槽。幸好 Visual Studio 提供了解决方案配置功能,可以让我们在编译时略过一些项目。 在解决方案上右击选择“属性”,我们将打开“解决方案属性页”。 在属性页种选择“配置”,则可以开始指定项目是否生成或部署。 然...

利用 ReSharper 自定义代码中的错误模式,在代码审查之前就发现并修改错误

多人协作开发的项目总会遇到代码编写风格上的差异。一般工具都能帮我们将常见的差异统一起来——例如 if 的换行;但也有一些不那么通用,但项目中却经常会出现的写法也需要统一。 例如将单元测试中的 Assert.AreEqual(foo.GetType(), typeof(Foo)); 换成 Assert.IsInstanceOfType(foo, typeof(Foo));。 阅读本文将学习...

WPF 程序无法触摸操作?我们一起来找原因和解决方法!

WPF 自诞生以来就带着微软先生的傲慢。微软说 WPF 支持触摸,于是 WPF 就真的支持触摸了。对,我说的是“支持触摸”,那种摸上去能点能动的;偶尔还能带点儿多指的炫酷效果。但是,WPF 推出那会儿,绝大部分开发者都还没有触摸屏呢,开发个程序要怎么验证支不支持触摸呢?微软先生无奈地决定——你写鼠标的代码就好了,我帮你转换!于是……一大波 BUG 袭来…… WPF 触摸失效的分类 ...

在移动端打开 Google 的网页快照

Google 的网页快照功能在原网页意外挂掉的时候能够临时为我们提供网页内的信息。例如我们要搜索的某项技术资料来源于某个个人站点,而现在他的域名到期了没有续费;例如我现在的博客在部署期间挂掉了,不能继续访问。这时 Google 网页快照都能够帮我们临时访问网页缓存。 PC 端的网页快照很容易找到并且点开: 然而移动端就不那么幸运了,找不到那个打开快照的小按钮: 这个时候,可...

在 HTML 超链接上添加可交互的 ToolTip

当鼠标滑过超链接的那一刻,我们都能想象出一个熟悉的白色提示框从鼠标指针所在的位置淡入。那是 ToolTip 提示框。HTML 中我们能通过简单的属性设置获得 ToolTip,但如果希望 ToolTip 是能交互的,那么就阅读本文吧! 原生 ToolTip 先来看看 HTML 原生自带的 ToolTip: 请将鼠标划至这里 代码非常简单: <a title="你看到了什...

如何删除 Windows 10 系统生成的 WindowsApps 文件夹

如果曾经修改过 Windows 10 应用安装路径到非系统盘,那么那个盘下就会生成一些文件夹。如果以后重装了系统或者应用删除了,挪位置了,那些文件夹依然在那里——删不掉! 大家都知道这是权限问题,然而如何修改权限以便成功删除呢? ▲ 更改应用的保存位置 那么,现在开始解决删不掉的问题吧! 第一步:属性→安全→高级 第二步:更改所有者 ▲ 更改所有者 ...

制作 Windows 10 安装盘,解决大于 4GB 的 Windows 10 镜像在 UEFI 模式下的安装问题

制作一个 Windows 安装 U 盘是很容易的,使用 UltraISO 这样的刻录工具量产一个 iso 镜像文件到 U 盘即可。然而随着 Windows 10 版本号的提升,镜像变得越来越大,终于 FAT32 文件系统不再能够容纳得下安装镜像文件 install.wim 了。 本文将介绍如何制作镜像文件大于 4GB 的 UEFI 启动的系统安装盘。 充分利用 Windows 8...

在 Windows 安装期间将 MBR 磁盘转换为 GPT 磁盘

以 UEFI 启动的 Windows 磁盘必须是 GPT 格式。本文将介绍如何在安装 Windows 期间将磁盘从 MBR 转换成 GPT。 特别注意:操作不慎可能丢失所有数据,如果你懂得安装系统的一些基本概念,那么可以继续阅读并尝试实操;否则请交给专业人士操作。切记,切记,切记!!! 第一步:按下 Shift + F10 启动命令提示符 在 Windows 的安装界面其实是可...