取消

一文看懂 .NET 的异常处理机制、原则以及最佳实践

什么时候该抛出异常,抛出什么异常?什么时候该捕获异常,捕获之后怎么处理异常?你可能已经使用异常一段时间了,但对 .NET/C# 的异常机制依然有一些疑惑。那么,可以阅读本文。 本文适用于已经入门 .NET/C# 开发,已经开始在实践中抛出和捕获异常,但是对 .NET 异常机制的用法以及原则比较模糊的小伙伴。通过阅读本文,小伙伴们可以迅速在项目中使用比较推荐的异常处理原则来处理异常。 ...

在 Windows 系统上降低 UAC 权限运行程序(从管理员权限降权到普通用户权限)

在 Windows 系统中,管理员权限和非管理员权限运行的程序之间不能使用 Windows 提供的通信机制进行通信。对于部分文件夹(ProgramData),管理员权限创建的文件是不能以非管理员权限修改和删除的。 然而,一个进程运行之后启动的子进程,会继承当前进程的 UAC 权限;于是有时我们会有降权运行的需要。本文将介绍 Windows 系统上降权运行的几种方法。 本文的降权运行指...

使用 Source Generator 在编译你的 .NET 项目时自动生成代码

本文将带你为你的某个库添加自动生成代码的逻辑。 本文以 dotnetCampus.Ipc 项目为例,来说明如何为一个现成的 .NET 类库添加自动生成代码的功能。这是一个在本机内进行进程间通信的库,在你拥有一个 IPC 接口和对应的实现之后,本库还会自动帮你生成通过 IPC 代理访问的代码。由于项目加了 Roslyn 的 SourceGenerator 功能,所以当你安装了 dotnetC...

使用 Roslyn 对 C# 代码进行语义分析

Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的源代码。之前我写过一些使用 Roslyn 进行语法分析的文章。使用语法分析,可以轻松为代码编写提供各种错误报告以及修改代码(见这里)。而使用语义分析,你可以像在运行时使用反射一样,在编译时访问源代码中的各种类型、属性、方法等,特别适合用来分析引用、生成代码等。当然,实际项目里面...

将 Windows Terminal 作为外部工具集成到其他工具/程序/代码中

Windows Terminal 在 Windows 上是一款 UWP 应用,然而其依然具有良好的与外部工具的集成特性,你可以在其他各种工具中配置使用 Windows Terminal 打开。 本文介绍如何配置使用 Windows Terminal 打开。 命令行调用 在应用商店可以下载到 Windows Terminal (Preview),下载安装后,你就可以开始使用 wt...

WHAT DID DELL DO? All WPF apps are rendered in a mess!

Recently, we have received many feedbacks from users, saying that our software interface is a mess, and there is no way to find any button locations. That’s really difficult to resolve because we d...

所有 WPF 程序的界面渲染完全糊掉,竟是戴尔电脑惹的锅?

近期收到了多起来自用户的反馈,说我们软件界面糊成一团,完全没办法看到按钮在哪里。我一看,这可棘手了,完全不是我们软件能渲染出来的样子啊! 本文将先给出结论帮助大家解决问题,随后再展示我们的调查过程。 This post is written in multiple languages. Please select yours: ...

删删删!快速将旧版 .NET Framework 的 WPF / Windows Forms 项目格式(csproj) 迁移成新版 SDK 风格的项目格式

现在再使用 Visual Studio 创建新的 WPF 项目时,将默认引诱你使用 .NET 6(或者 5、.NET Core 3.1)框架和配套的新的 SDK 风格的项目文件(csproj)。 新项目格式的人类可读性比旧项目要高出不少,而且新的 Visual Studio 也为它增加了非常多好用的显示效果和功能。但如果你手头有一个旧的 WPF 项目,要怎么才能使用到新项目格式带来的各种好...

.NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)

长文预警!!! UWP 程序有 .NET Native 可以将程序集编译为本机代码,逆向的难度会大很多;而基于 .NET Framework 和 .NET Core 的程序却没有 .NET Native 的支持。虽然有 Ngen.exe 可以编译为本机代码,但那只是在用户计算机上编译完后放入了缓存中,而不是在开发者端编译。 于是有很多款混淆工具来帮助混淆基于 .NET 的程序集,使其稍微...

为 .NET Core / Framework 程序开启大内存感知(LargeAddressAware),使 32 位程序支持最多 4GB 的用户空间内存

如果你不做特殊处理,把你的项目以 x86 的架构进行编译,那么你的应用程序在 Windows 上最多只能使用 2GB 的内存(地址空间)。如果你的项目使用 .NET Framework 框架,那么现行有很多简单的方法来帮你实现大内存感知,但 .NET Core 框架下却没有。所以我写了一个库 dotnetCampus.LargeAddressAware,帮助你轻松实现 32 位程序的大内存感...

C#/.NET 如何创建带有本机依赖的多框架多系统 NuGet 包

正常如果你想写一个 .NET 的 NuGet 包,直接打包就好了,你的引用程序集会出现在 NuGet 包内的 lib 文件夹内。然而,如果我们的 NuGet 包包含本机依赖的话怎么办呢? 我们的项目需求 假设我们要做一个 NuGet 包 Walterlv.MixPackage,包含以下内容: 一个要被引用的托管程序集 Walterlv.MixPackage.dll 一...

将美化进行到底,使用 Oh My Posh 把 PowerShell 做成 oh-my-zsh 的样子

不知你有没有看过 Linux 上 oh-my-zsh 的样子?看过之后你一定会惊叹,原来命令行还能这么玩!然而 Windows 下能这么玩吗?答案是可行的,接下来就来看看怎么玩。 Windows 下我们用 Oh My Posh 在 PowerShell 中实现这样的效果。先放一张我的美化效果图: 接下来,我们用三个步骤完成这样的美化。 第零步:挑选一个终端 鉴于无论是 P...

无需安装 VS2019,在 Visual Studio 2022 中编译 .NET Framework 4.5/4/3.5 这样的古老框架

Visual Studio 2022 已正式发布!着急升级的小伙伴兴致勃勃地升级并卸载了原来的 Visual Studio 2019 后,发现自己的几个库项目竟然无法编译通过了。究其原因,是因为我的一些库依旧在支持古老的 .NET Framework 4.5 框架,而 Visual Studio 2022 不再附带如此古老的目标包了。 我之前在 另一篇文章 中告诉大家通过将 Visual ...

WPF 使用 WindowChrome,在自定义窗口标题栏的同时最大程度保留原生窗口样式(类似 UWP/Chrome)

WPF 自定义窗口样式有多种方式,不过基本核心实现都是在修改 Win32 窗口样式。然而,Windows 上的应用就应该有 Windows 应用的样子嘛,在保证自定义的同时也能与其他窗口样式保持一致当然能最大程度保证 Windows 操作系统上的体验一致性。 本文将使用 WindowChrome 来自定义窗口样式,使其既保留原生窗口样式和交互习惯,又能够具备一定的自定义空间。 使...

Visual Studio 2022 升级不再附带 .NET Framework 4.5 这种古老的目标包了,本文帮你装回来

就在北京时间 2021 年 11 月 9 日凌晨,Visual Studio 2022 正式发布了!着急升级的小伙伴兴致勃勃地升级并卸载了原来的 Visual Studio 2019 后,发现自己的几个库项目竟然无法编译通过了。究其原因,是因为我的一些库依旧在支持古老的 .NET Framework 4.5 框架,而 Visual Studio 2022 不再附带如此古老的目标包了。 本文...

各个版本 Windows 11 / Windows 10 的名称、完整版本号、开发代号和系统自带的 .NET Framework 版本

自 Windows 10 (1903) 版本开始,自带的 .NET Framework 版本一直保持为 4.8 并且不再允许手动安装。如果 .NET Framework 出了问题,基本只能重装系统;而 Windows Update 就有可能把 .NET Framework 搞坏。 Windows 11 Windows 11 名称 构建版本 ...

了解 Windows/Linux 下命令行/Shell 启动程序传参的区别,这下不用再担心 Windows 下启动程序传参到 Linux 下挂掉了

启动某个程序,再带上一堆参数,这几乎是程序员们每天必做到事情。另外再算上各种辅助程序员们的自动化脚本,辅助构建的 CI(持续集成)等等,程序员们在创造大量的应用程序然后调用它们。 但是,不经常跨系统玩这些的小伙伴们注意了,Windows 下的 Shell 和 Linux 下的 Shell 是有区别的!如果你不了解这些区别,很容易造成在 Windows 下编写的代码/脚本在 Linux 下无...

Roslyn 入门:使用 .NET Core 版本的 Roslyn 编译并执行跨平台的静态的源码

Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够编译并执行我们的代码。 作为 Roslyn 入门篇文章之一,你将可以通过本文学习如何开始编写一个 Roslyn 扩展项目 —— 编译一个类,然后执行其中的一段代码。 本文是 Roslyn 入门系列之一: Roslyn 入门:使用 Visual Studio 的语法可视化(...

使用 WPF 做一个可以逼真地照亮你桌面的高性能阳光

本文想要做的,可不是随便弄一点阳光的半透明形状,然后简单地放到桌面上,而是真真正正地要照亮桌面上的窗口元素!并且,全程使用 GPU 加速,而且代码超简单。 效果预览 先放上两张动图看看效果,GIF 比较大,如果博客里看不到可以点击下面的小标题下载下来看。 阳光扫过云层: 阳光扫过 Visual Studio: 可以看到,阳光经过云层时,强烈的光芒与云层的光光部分叠加...

路径标记语法(Path Markup Syntax)完全教程

无论是 WPF、UWP 还是 Xamarin、MAUI、WinUI,都有可以绘制任意形状的 Geometry 类型,它支持一种路径标记语法,可以拟合各种形状。同时,SVG 格式使用的也是完全相同的路径语法,你用文本编辑器打开一个 SVG 格式时也会看到这样的字符串。 你只需要阅读本文,即可从零开始了解并最终学会路径标记语法。 示例 一开始,我们用一张 SVG 图来看看一个典型的...

用 WiX 制作安装包:创建一个简单的 exe 安装包

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 本文将带大家制作一个简单的 exe 安装包。 本文开始前,请确保你已经可以生成一个最简单的 msi 安装包了: 用 WiX 制作安装包:创建一个简单的 msi 安装包 由于 exe 格式的安装包自己带了 UI,所以 msi 中的 UI 怎么样都是可以不用管的(不用纠结 msi 做成了扫...

0x800b0109 - 已处理证书链,但是在不受信任提供程序信任的根证书中终止。

有时在安装程序时无法安装出现错误,或者在更新某些系统组件时也遇到同样的错误:“已处理证书链,但是在不受信任提供程序信任的根证书中终止。”。 本文介绍其原因和解决方法。 错误 ▲ 错误提示 - 来自 .NET Framework ▲ 错误提示 - 来自WiX 入门教程 错误码:0x800b0109。 已处理证书链,但是在不受信任提供程序信任的根证书中终止。 ...

WiX Toolset 安装包制作入门教程(目录篇)

WiX 全称为 Windows Installer XML,是使用 XML 文件创建 Windows 安装程序的一组工具集。它开源且完全免费。 虽然这一组工具集功能非常强大,但学习曲线较陡峭,在没有人指导的情况下独立完成完整的安装包制作会比较困难。对安装包技术零基础的开发者,甚至仅凭阅读官方文档的教程系列也难以完成 Hello World 级别的安装包制作。所以本系列博客的出现旨在填补官方...

如何调试 WiX Burn 制作的自定义托管引导程序的 exe 安装包

WiX 本身很强大,使用本来也没那么难。奈何 WiX 3 的官方文档可读性极差且长期不更新,于是新手在使用 WiX 制作安装包时极容易出问题,导致制作的安装包各种行为不正常。 虽然我写了一系列的 WiX 安装包入门教程来帮助大家避坑,还写了一些常见问题的解决方法,但大家遇到的问题总会比我整理的要多。所以教大家 查看日志 很多时候,看日志能帮助你快速找到原因。以下是查看日志的方法...

用 WiX Burn 制作托管安装包:出现 0x80131508 错误

使用 WiX 的 Burn 引擎制作自定义托管引导程序的 exe 安装包时,双击生成的安装包没有反应。如果查看日志可以发现有 0x80131508 错误。本文介绍其调查和解决方法。 现象 双击制作的自定义引导程序的 exe 安装包没有反应,通过查看 Burn 引擎的输出日志可以发现如下关键的错误码: ... [BCD8:B4DC][2021-07-16T11:47:32]i00...

用 WiX 制作安装包:设置的 .NET Framework 前置会始终安装,即使目标电脑已经自带或装好

使用 WiX 的 Burn 引擎制作自定义托管引导程序的 exe 安装包时,你可能会遇到这种情况:明明目标电脑上已经装好了 .NET Framework,但无论如何就是会提示安装,始终不启动自定义的安装界面。 现象 即使是在开发机上(.NET Framework 已经装好),双击制作的 exe 安装包也依然会提示安装 .NET Framework: 如果强行安装,装完也依然...

使用 WiX 创建最简单的安装包过程中可能出现的问题和解决方案汇总

本文是 WiX Toolset 安装包制作入门教程 系列中的番外篇,可前往阅读完整教程。 用 WiX 制作安装包还是有些门槛的。如果你没有完全按照我教程中提供的步骤来执行(例如你用了自己的项目名,却在复制关键代码时没有改成自己的),那么极有可能在最终生成安装包后无法运行。 本文记录一些跟着教程做时可能遇到的常见问题,帮助你在遇到问题后能及时找到解决方案。如果看完还没有解决你的问题,欢迎留...

用 WiX Burn 制作托管安装包:出现 0x80070002 错误

使用 WiX 的 Burn 引擎制作自定义托管引导程序的 exe 安装包时,双击生成的安装包没有反应。如果查看日志可以发现有 0x80070002 错误。本文介绍其调查和解决方法。 现象 双击制作的自定义引导程序的 exe 安装包没有反应,通过查看 Burn 引擎的输出日志可以发现如下关键的错误码: ... [1874:8D8C][2021-07-15T19:28:29]i00...

如何查看用 WiX 制作的安装包的日志

如果你使用 WiX 制作安装包,并且遇到了问题,一定需要一个趁手的调试方案。本文介绍如何查看 WiX 制作的安装包的日志。 WiX 使用 Burn 引擎来制作 exe 捆绑包,默认情况下 Burn 引擎使用自带的安装界面来执行安装。Burn 引擎提供了自定义引导程序的功能,于是你可以利用 Burn 引擎做出自己的 UI 来。比如 用 WPF 来制作安装包界面。 因此,我们有通用的方法...

用 WiX 制作安装包:制作 WPF 安装包界面(入门篇)

本文是 WiX Toolset 安装包制作入门教程 系列中的一篇,可前往阅读完整教程。 前面我们制作完成了一个可自动安装 .NET Framework 依赖的 exe 安装包,下面我们将学习制作自己的安装界面。本文使用 WPF 制作安装包界面。 本文准备做什么? 本文将继续在前一篇文章的解决方案基础上继续学习。 我们将做这些事情: 创建一个 WPF 项目,用来做安装包...