取消

在 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 自带那么多图标,去哪里找呢?

无意间发现我的 D 盘根目录中大部分的文件夹都是系统专用文件夹,有自己的独特图标,偶有一两个开发用的文件夹是默认图标。于是想把它们改成独特样式,而且是 Windows 10 那些新图标样式! 这是我的文件夹,我希望把最上面几个文件夹的图标改成下面那些风格。 大家都知道在文件夹上右键,选择 属性 → 自定义 → 更改图标,这里可以选择很多图标,但用了很多年看腻了,Windows 1...

制作 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 的安装界面其实是可...

安装 Windows 需要知道的 256 个问题

如果你希望更刺激地安装 Windows,那么你需要了解很多 Windows 系统相关的问题。 为什么 UEFI 方式启动的 U 盘必须使用 FAT32 文件系统? 因为 NTFS 是 Windows 系统专属的文件系统,而 UEFI 目前并不支持 NTFS。 于是,如果在主板设置中选择“仅 UEFI 启动”,那么 NTFS 格式的启动 U 盘在 F12 启动选项中将不可见;而如果设...

WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制

无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。 本文中,我将将尽量避免设置 From 和 To 值,让动画可以随时中断并重新开始,而中途不会出现突兀的变化。 本文...

分享一个算法,计算能在任何背景色上清晰显示的前景色

背景色千差万别,如果希望在这样复杂的背景色下显示清晰可辨的前景色(例如显示文字),那如何选择这样的前景色才能确保适用于所有的背景呢? 灰度图的心理学公式 红绿蓝三色是非常不直观的颜色表示的方法,如果不经过训练,人类几乎没有办法直接通过 RGB 的值来猜出大概的颜色来。而 HSB 是用来解决人眼感知问题的,它将颜色用色相、饱和度、明度来表示。 可是,即便是 HSB 也不能完美解决...

在 Windows 10 上为 WPF 窗口添加模糊特效(就像开始菜单和操作中心那样)

其实我是希望能够找到为 Win32 桌面程序实现 Fluent Design System 效果的,不过一直没找到。倒是发现了一个可以让 Win32 桌面程序做出类似 Windows 10 开始菜单和操作中心那种模糊效果的方法。 写这篇文章并不意味着我推荐大家这么去做,只是希望将方法总结出来,作为一个研究点而已。 本文提供了一个完整的用于在 Windows 10 上实现模糊特效的 C# ...

应该抛出什么异常?不应该抛出什么异常?(.NET/C#)

我在 .NET/C# 建议的异常处理原则 中描述了如何 catch 异常以及重新 throw。然而何时应该 throw 异常,以及应该 throw 什么异常呢? 究竟是谁错了? 代码中从上到下从里到外都是在执行一个个的包含某种目的的代码,我们将其称之为“任务”。当需要完成某项任务时,任务的完成情况只有两种结果: 成功完成 失败 异常处理机制就是处理上面的第 2 种...

.NET/C# 建议的异常处理原则

“体验”一词早已泛滥却又能够粗略地表达开发团队对客户端产品的要求,“质量”在 卡诺模型(KANO Model) 中是“必备特性”——做得好了用户感觉不到,做得差一点儿用户就会破口大骂。 本文将以提升客户端 GUI 产品质量为目标,谈谈 .NET/C# 中建议的异常处理方式。(如果想了解更具体的应该抛出什么异常,请前往我的另一篇文章 应该抛出什么异常? - 吕毅) 不恰当的异常处理...

有些异常堆栈中真没我们写的源码

有时候会发生一些异常,但异常的堆栈信息中完全找不到我们自己写的源码,这样的异常到底怎么调试! 本文基于 WPF on .NET Framework 4.5 文章一开始,先列出几个异常的前几行。 System.ComponentModel.Win32Exception (0x80004005): Not enough quota is available to process this...