C# 8.0 引入了可为空引用类型和不可为空引用类型。当你需要给你或者团队更严格的要求时,可能需要定义这部分的警告和错误级别。 本文将介绍 C# 可空引用类型部分的警告和错误提示,便于进行个人项目或者团队项目的配置。 开启可空引用类型以及配置警告和错误 本文的内容本身没什么意义,但如果你试图进行一些团队配置,那么本文的示例可能能带来一些帮助。 C# 8.0 如何在项目中...
git subtree 的使用
本文收集 git subtree 的使用。 将 B 仓库添加为 A 仓库的一个子目录 在 A 仓库的根目录输入命令: $ git subtree add --prefix=SubFolder/B https://github.com/walterlv/walterlv.git master 这样,B 仓库的整体,会被作为 A 仓库中一个 SubFolder/B 的子文件夹,...
通过子类化窗口(SubClass)来为现有的某个窗口添加新的窗口处理程序(或者叫钩子,Hook)
创建窗口的时候,可以传一个消息处理函数。然而如果窗口不是自己创建的,还能增加消息处理函数吗?答案是可以的,除了 SetWindowsHookEx 来添加钩子之外,更推荐用子类化的方式来添加。 本文介绍如何通过子类化(SubClass)的方式来为窗口添加额外的消息处理函数。 子类化 子类化的本质是通过 SetWindowLong 传入 GWL_WNDPROC 参数。 SetWi...
当无边框窗口被子窗口遮挡导致难以调节窗口大小时,可通过处理 NCHITTEST 消息重新支持调节窗口大小
做无边框窗口之后,我们有方法可以让窗口的标题栏区域和边缘调大小的区域继续正常工作,直到——这个窗口上面覆盖了其他的子窗口。这个子窗口会吃掉消息导致父窗口的边缘无法再继续处理这些消息。 子窗口遮挡了父窗口 看一下下面的动画,这个窗口的下半部分放了一个子窗口。 然后尝试在边缘调节窗口尺寸,会发现被子窗口覆盖的部分是无法完成窗口大小调节的。 究其原因,是子窗口处理掉了与调窗...
Windows 系统的默认字体是什么?应用的默认字体是什么?
作为中文应用的开发者,我们多半会认为系统的默认字体是“微软雅黑”。然而如果真的产生了这种误解,则很容易在开发本地化应用的时候踩坑。 于是本文带你了解 Windows 系统的默认字体。 Windows 10/8.1/8/7/Vista Windows 操作系统的默认字体是 Segoe UI(发音为 see go 这两个单词),默认的字体大小为 9 点。 Segoe UI 是...
如何给 GitHub Pages 配置多个域名?
因为以前对域名进行了一些调整,所以实际上我的博客在历年来经历了两个域名 blog.walterlv.com(新)和 walterlv.com(旧)。然而 GitHub Pages 只支持一个自定义域名,所以为了兼容旧域名的访问,如何可以让多个域名对应同一个 GitHub Pages 呢? 背景 (新) walterlv.com (旧) 以前不会碰...
一点点从坑里爬出来:如何正确打开 WPF 里的 Popup?
在 WPF 中打开一个 Popup 并没有想象当中容易。虽说提供了一个 IsOpen 属性用于显示 Popup,但实际上造成的 Bug 会让你解得死去活来。Win32 的 WS_POPUP 也坑,不过 WPF 会额外再带来一些,所以本文只说 WPF。 先说结论 本文一开始就贴出打开一个 Popup 的代码 // 在以下代码中,我们假定 popup 是我们要显示出来的 Popup...
VSCode:当匹配到结果时,如何一次性全部选中操作(复制/删除)?
最近需要处理几十万行的文字,然后提取出数千行(嗯,我在做输入法词库)。在 VSCode 里我用正则匹配到了想要的结果后,如何能够快速把这些行提取出来呢? 其实非常简单,Alt + Enter 即可选中所有已经匹配到的文字。 来,我们看这个具体的例子: 这里有一个几十万行的词库,我需要将其中的英文部分提取出来做成单独的词库。于是我使用正则表达式,匹配到所有英文词。 接着,按下 ...
WPF:无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围内定义它时,已注册了名称。
最近在改一段 XAML 代码时,我发现无论如何给一个控件添加 Name 或者 x:Name 属性时都会出现编译错误:无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围内定义它时,已注册了名称。 编译错误 编译时,出现错误: 无法对元素“XXX”设置 Name 特性值“YYY”。“XXX”在元素“ZZZ”的范围内,在另一范围...
在 Visual Studio 2019 (16.5) 中查看托管线程正在等待的锁被哪个线程占用
Visual Studio 2019 (16.5) 版本更新中带来了一项很小很难注意到却非常实用的功能,查看哪一个托管线程正在持有 .NET 对象锁。 如果你不了解这个功能如何使用,那么可以阅读本文。 更新日志 Visual Studio 的官方更新日志中对此功能的描述: View which managed thread is holding a .NET objec...
WPF 中如何绑定附加属性?XAML 中记得加括号,C# 中记得不能用字符串
在 XAML 中写绑定是 WPF 学习的必修课,进阶一点的,是用 C# 代码来写绑定。然而一旦绑定的属性是附加属性,好多小伙伴就会开始遇到坑了。 本文将介绍如何在 XAML 和 C# 代码中绑定附加属性。 背景代码 开始遇到这个问题的背景是我定义了一个附加属性,然后试图通过绑定的方式完成一些业务。 用附加属性来完成的很大一个好处在于不需要改动原有的代码破坏原来的类。例如我只需...
设置用户无需密码自动登录到 Windows 系统
你一定要为你的 Windows 用户账户设置密码,一来会安全一些,而来可以远程登录使用;但有时出于一些特殊的目的,不希望在每次开机后都必须输入密码才能进入系统。于是你可以使用本文提供的方法在每次开机的时候免密码登录到 Windows 操作系统。 步骤 在 Windows 搜索框中输入 netplwiz,然后回车打开命令; 去掉“要使用本计算机,用户必须输入用户名和密码”...
修复 Windows 10 设置界面里面混乱的语言翻译
Windows 10 每次新发布一个版本都会遇到各种各样的新型 Bug。 本文介绍的是 Windows 10 的设置界面里面,各种各样的语言文字都很混乱,就像统一错位了一样。本文也会同时介绍其修复方法。 系统版本 会出现此问题的系统是 Windows 10 英文版系统。 注意,是 Windows 10 英文版系统,而不是中文版系统的英文语言。如果你想要识别这样的系统的话,也很...
使用 SoftEther VPN 在 VPS 和个人电脑之间搭建 VPN 网络
VPN 全称是 Virtual Private Network(虚拟专用网络),可以在多台设备之间建立安全的通信网络。VPS 是 Virtual Private Server,虚拟专用服务器,指的是一台虚拟的电脑,用于提供服务。 注意,本文不会谈及科学上网相关的内容。本文建立 VPN 网络单纯是为了对外提供服务。 VPN 虚拟专用网络 为什么我们需要一个 VPS 为了对公众提...
推荐 .NET/C# 开发者安装的几款代码分析插件或对应的代码分析 NuGet 包
如果你使用的是旧版本的 Visual Studio,那么默认的代码分析规则集是“最小建议规则集”。基于这个,写出来的代码其实只能说是能跑通过而已。随着 Roslyn 的发布,带来了越来越多更强大的代码分析器,可以为编写高质量的代码带来更多的帮助。 作为 .NET/C# 开发者,强烈建议安装本文推荐的几款代码分析器。 推荐 Visual Studio 2019 自带的分析器...
用命令行执行 .NET 单元测试时,如何仅执行符合某些条件的单元测试
本文介绍使用 dotnet test 命令进行单元测试的时候,过滤出被测项目中的一部分测试出来,仅测试这一部分。 背景 建一个 .NET Core 的单元测试项目,例如项目名字是 Walterlv.Demo.Tests。举例其中的一个测试类如下: using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Wal...
.NET WebClient 类下载部分文件会错误?可能是解压缩的锅
一直在使用 WebClient 下载文件,.NET 已经封装好,所以用起来代码非常简洁;但直到今天发现有一个文件一直不能正确下载下来。 本文介绍这个问题的原因和解决方法,更重要的是给出调查方法。 本文所涉及到的域名已经过敏感信息处理,所以实际上你是无法访问到的;但这不影响本文对调查方法的描述。 问题 我原本是使用如下的代码去下载任意文件的(参数经过简化)。 private ...
如何在终端和 PowerShell 中将一个命令自动重复执行多次
你可能有很多原因要将一个命令重复执行多次,本文介绍在多个平台下如何多次重复执行命令。 背景 最近遇到一个偶然复现的单元测试错误,于是在每次运行时,打算重复运行多次来调查问题是否已经解决。 实际上,重复执行命令有更多用途: 通过重复执行来复现一些偶发的问题 执行一组命令,每次只有参数不同 大大减轻手工输入命令的工作量 Bash Linux 或者 Mac 系统...
Linux 系统根目录下的文件夹
本文介绍 Linux 系统根目录下的各种文件夹及其用途,了解这些目录可以帮助你更好地管理你的 Linux 主机。 Linux 系统根目录 各个不同 Linux 发行版的根目录会有一些区别,但大多数发行版的主要的目录都是有的。 /bin binary 用于存放经常使用的命令 /boot boot 启动时的一些核心文件 /dev device 外部设备 /etc ...
收集的 Linux VPS 在线重装系统脚本
因为 VPS 上预装的操作系统我并不习惯,所以打算重装一个。有的 VPS 服务商提供了较多种类的系统选择,有的却没有。如果你发现你希望重装的系统服务商没有提供,可以考虑自己安装。 重装脚本 - 来自萌咖 以下是来自萌咖的一键重装脚本的发布贴: [ Linux VPS ] Debian(Ubuntu)网络安装/重装系统一键脚本 - 萌咖 [ Linux VPS ] Ce...
为什么实现 .NET 的 ICollection 集合时需要实现 SyncRoot 属性?如何正确实现这个属性?
非泛型版本的 ICollection 中有 IsSynchronized 属性和 SyncRoot 属性,这两个属性被用来设计成以线程安全的方式访问和修改集合。不过这个设计让线程安全的访问由集合的实现方转嫁到了调用方,导致要么很难实现,要么很难调用。 虽然泛型版本的 ICollection<T> 已经改进了设计,不再引入 SyncRoot 这样的属性到接口中,但如果我们在某些场...
全民 https!使用 FreeSSL 申请免费的 https 证书
到现在还不为你的网站添加 https 的话,浏览器已经会非常显眼地显示“不安全”了。 感谢 Let’s Encrypt,感谢 buypass,个人使用申请 https 证书的话已经可以免费了。 关于域名 我们使用 FreeSSL.org 申请的是域名证书,对一个或多个域名生效。所以,你至少需要拥有一个域名。如果没有,去 https://tld-list.com/ 输入你心仪的域...
如何设置 ASP.NET Core 程序监听的 IP 和端口
Web 服务需要配置监听的 IP 和端口才可以对外提供真正的服务。本文介绍如何设置 ASP.NET Core 程序监听的 IP 和端口。 ASP.NET Core 程序默认集成了 Kestrel 服务器,可以直接对外提供 Web 服务。虽然可以直接提供服务,但通常建议使用反向代理服务器来间接提供服务。因此,本文建议的大多数设置监听 IP 和端口的方法都是“临时方法”,即那种“配置出来”...
使用 Frp 为你的 Web 服务添加 https 支持
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 在众多反向代理应用中,frp 的最大特点就在于内网穿透。所以,如果你有将内网对外提供 Web 服务的需求,就可以考虑使用 frp 为你的 Web 服务提供 https 支持。 下载 frp 前往 GitHu...
为 ASP.NET Core 程序制作 URL 的 301/302 跳转
如果你有一些需要重定向网页 URL 的情况,可以返回 HTTP 状态码 301/302 告诉浏览器或者搜索引擎访问新的 URL。本文描述如何在 ASP.NET Core 中进行重定向。 HTTP 状态码 301/302 301 表示“Moved Permanently”,即永久移动。通过返回此状态码可以告知浏览器或者搜索引擎此 URL 已经永久移动到了新的 URL 地址。搜索引擎...
使用 Kestrel 为你的 ASP.NET Core 服务添加 https 支持
Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。它内置集成在了 ASP.NET Core 项目模板中,所以编写和对外开放一个 Web 服务会非常简单。 虽然不推荐直接使用 Kestrel 对外提供 Web 服务,但为了简单的话,临时使用也是非常不错的选择。 Kestrel 是一个跨平台的适用于 ASP.NET Core 的 Web 服务器。 Ke...
三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)
虽然使用 Visual Studio 创建 ASP.NET Core 程序的时候可以选择是否添加 https 支持,不过这种方式只添加了 localhost 的证书,只有本地访问时浏览器才会承认。真正对外公开服务的时候这样是绝对没法儿提供 https 服务的。 本文介绍使用三种不同的方式添加 https 的支持,三种方法各有优劣,本文会进行比较并给出不同的适用场景。你自己选择就好。 ...
.NET 将多个程序集合并成单一程序集的 4+3 种方法
编写 .NET 程序的时候,我们经常会在项目的输出目录下发现一大堆的文件。除了我们项目自己生成的程序集之外,还能找到这个项目所依赖的一大堆依赖程序集。有没有什么方法可以把这些依赖和我们的程序集合并到一起呢? 本文介绍四种将程序集和依赖打包合并到一起的方法,每一种方法都有其不同的原理和优缺点。我将介绍这些方法的原理并帮助你决定哪种方法最适合你想要使用的场景。 四种方法 目前我已知...
.NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
.NET 中文件打开的 API File.Open 提供了多种不同的文件打开方式,这些方式大多数与 Windows 文件 API 中的模式是对应的,但也有一些 .NET 层面的判断以及名称的变化。在 .NET 层你可以选择适合你业务场景需要的文件打开方式。 文件打开方式 文件打开的多个重载方法中,除了封装好的 OpenRead / OpenWrite 之外,其他都是需要指定 Fil...
Win32 方法 CreateFile 中选择合适的文件打开模式(CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXISTING)
Windows 打开文件的 API 中提供了多种不同的文件打开方式。你可以根据你的业务场景选择适合你的文件打开方式。 Windows API OpenFile 方法只能打开已经存在的文件,而使用 CreateFile 则可以在打开文件的同时应对不存在文件时的创建。 HANDLE CreateFileW( LPCWSTR lpFileName, ...