取消

Directory.GetFiles 中传入搜索字符串(Search Pattern)的神奇规则

众所周知,文件名的匹配规则里同配符 ? 代表单个字符,通配符 * 代表多个字符。然而,具体到 Directory.GetFiles(string path, string searchPattern) 方法调用时,却又有一些大家不一定知道的细节。不信?我出一道题大家试试! 一道测试题 假设在调用 Directory.GetFiles(string path, string sea...

CS8350:不允许使用“Foo(ref x, ref y)”的这种参数组合,因为它可能会在其声明范围之外公开由参数 x 引用的变量

标题所述的是一个 .NET/C# 程序的编译错误。这个编译错误是 C#7.2 时就引入的,但更新到 Visual Studio 2022(17.4) 后,有更多的情况会被判定为发生了此错误。 本文会解释这个错误的原因和解决办法。 新引入的 CS8350 编译错误 以下这段代码,在 Visual Studio 2022(17.4)版本中会出现编译错误 CS8350,但在低版本的 ...

使用 AutoMapper 自动映射模型时,处理不同模型属性缺失的问题

使用 AutoMapper 可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码。不过,如果各个模型之间存在一些差异的话(比如多出或缺少一些属性),简单的配置便不太行。本文帮助你解决这个问题。 关于 AutoMapper 的系列文章: 使用 AutoMapper 自动在多个数据模型间进行转换 使用 AutoMapper 自动映射模型时,处理不同模型属性缺失的问题 ...

使用 AutoMapper 自动在多个数据模型间进行转换

访问数据库、IPC 通信、业务模型、视图模型……对于同一个业务的同一种数据,经常会使用多种数据模型工作在不同的代码模块中。这时它们之间的互相转换便是大量的重复代码了。 使用 AutoMapper 便可以很方便地在不同的模型之间进行转换而减少编写太多的转换代码(如果这一处的代码对性能不太敏感的话)。 关于 AutoMapper 的系列文章: 使用 AutoMapper 自动在多...

解决 WPF 分组的 ItemsControl 内部控件无法被 UI 自动化识别的问题

如果你试图给 WPF 的 ItemsControl 加入自动化识别,或者支持无障碍使用,会发现 ItemsControl 内的元素如果进行了分组,则只能识别到组而不能识别到元素本身。如果你正试图解决这个问题,那么本文正好能给你答案。 现象 现在,我们在 ItemsControl 的内部放几个按钮并进行分组。用自动化软件去捕获它,会发现整个 ItemsControl 会被视为一个控...

如何让 WPF 程序更好地适配 UI 自动化

Windows 中很早就内置了 UI 自动化机制(UIAutomation 从 Windows XP SP3 就开始提供了),WPF 第一个版本开始也提供了 UI 自动化的支持。所以按道理说如果你使用了 WPF,那么你的 UI 做准备好了随时可被自动化的准备。 虽说 WPF 支持不错,但我还是有几点需要说明一下: 这里我说的是“UI 自动化”,而不是“UI 自动化测试”;前者比...

最简单的代码,让 WPF 支持响应式布局

响应式布局在各种现代的 UI 框架中不是什么新鲜的概念,基本都是内置支持。然而在古老的 WPF 框架中却并没有原生支持,后来虽然通过 Blend 自带的 Interactions 库实现了响应式布局,但生成的代码量太大了,而且需要引入额外的库。 如果只是希望临时局部地方使用响应式布局,那么其实可以直接使用 WPF 内置的绑定机制来完成响应式布局。本文介绍如何使用。 思路是在控件尺寸发...

MSBuild/Roslyn 和 NuGet 的 100 个坑

MSBuild 不愧是强大的编译器,它提供的扩展机制让你几乎可以编译任何类型的文件或项目;Roslyn 是全新编写的一套编译器,不过它保留了 MSBuild 的大部分机制;NuGet 是 .NET 生态系统中的包管理机制,被原生集成在新的 Microsoft.NET.Sdk 中。 不过,他们的坑还是挺多的;本文就是他们 100 个坑的集合。 系列博客 这是兄弟篇中的一篇,关于 ...

git subtree 不断增加的推送时间,解不玩的冲突!这篇文章应该能救你

原生 git 对于公共组件那种类型的子仓库的支持并不怎么好,就是那种某个子文件夹是一个另外的 git 仓库,并被多个 git 父仓库使用的形式。实际使用的感受甚至是“糟糕透了”。 这种并不友好的子仓库支持可能与 git 的设计理念有关,不过,git 的开发者始终在打补丁以稍微优化这样的体验。 不断增加的推送时间 如果你曾经在大仓库试过 git subtree push,你一定为...

git fetch 失败,因为 unable to resolve reference 'refs/remotes/origin/xxx': reference broken

我在使用 git fetch 命令的时候,发现竟然会失败,提示错误 error: cannot lock ref 'refs/remotes/origin/xxx': unable to resolve reference 'refs/remotes/origin/xxx': reference broken。 本文介绍如何修复这样的错误,并探索此错误产生的原因。 错误 在使用...

使用 Roslyn 分析代码注释,给 TODO 类型的注释添加负责人、截止日期和 issue 链接跟踪

如果某天改了一点代码但是没有完成,我们可能会在注释里面加上 // TODO。如果某个版本为了控制影响范围临时使用不太合适的方法解了 Bug,我们可能也会在注释里面加上 // TODO。但是,对于团队项目来说,一个人写的 TODO 可能过了一段时间就淹没在大量的 TODO 堆里面了。如果能够强制要求所有的 TODO 被跟踪,那么代码里面就比较容易能够控制住 TODO 的影响了。 本文将基于 ...

基于 Roslyn 同时为 Visual Studio 插件和 NuGet 包开发 .NET/C# 源代码分析器 Analyzer 和修改器 CodeFixProvider

Roslyn 是 .NET 平台下十分强大的编译器,其提供的 API 也非常丰富好用。本文将基于 Roslyn 开发一个 C# 代码分析器,你不止可以将分析器作为 Visual Studio 代码分析和重构插件发布,还可以作为 NuGet 包发布。不管哪一种,都可以让我们编写的 C# 代码分析器工作起来并真正起到代码建议和重构的作用。 本文将教大家如何从零开始开发一个基于 Roslyn...

Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码(语法分析)

Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性。以至于我们只需要编写很少量的代码便能够分析我们的项目文件。 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 Roslyn 扩展项目,如何开始分析一个解决方案(.sln)中项目(.csproj)的代码文件(.cs)。 本文是 Roslyn 入门系列之一: Roslyn 入门:使用 Visu...

WPF 窗口在 Visual Studio 调试的时候会被一个莫名其妙的调试层覆盖住

同样的程序,在使用 Visual Studio 调试的时候和直接运行的时候相比,总会有一些细微之处是不同的。大多数时候这些不同可以忽略,但是一旦这些不同是我们产品需求的一部分的时候,你可能就会发现调试和非调试状态下的行为不同却找不到原因,非常抓狂! 本文记录我遇到的一个 WPF 窗口调试的案例。看完后大家至少知道 Visual Studio 调试时的一个小坑,更进一步则可以在出现奇妙问题的...

使用 ImageMagick 轻松制作带有多种尺寸的 ico 图标文件

ico 图标格式是一种包含多种尺寸位图的容器格式,Windows 用这种格式来作为图标是为了能让文件图标在各种不同显示尺寸下都能看起来清晰可辨。可是,相当多的平面设计软件都没有内嵌 ico 格式的支持(尤其是 macOS 版的),导致设计师很难直接输出 ico 格式的图标。另外,有些自称能 png 转 ico 格式的图片转换器虽然能生成 ico 格式,但这种 ico 格式内只包含一种位图尺寸...

在多个可执行程序(exe)之间共享同一个私有部署的 .NET 运行时

从 .NET Core 3 开始,.NET 应用就支持独立部署自己的 .NET 运行时。可以不受系统全局安装的 .NET 运行时影响,特别适合国内这种爱优化精简系统的情况……鬼知道哪天就被优化精简了一个什么重要 .NET 运行时组件呢!然而,如果你的项目会生成多个 exe 程序,那么他们每个独立发布时,互相之间的运行时根本不互通。即便编译时使用完全相同的 .NET 框架(例如都设为 net6...

如何检测当前操作系统是否支持运行 .NET Core 3 / .NET 5 / .NET 6 应用?

虽然微软官方声称 .NET Core 3 / .NET 5 / .NET 6 应用支持在 Windows 7 及以上运行,但你不应该轻信。因为微软还在某个隐秘的角落里说明还应安装一枚 KB2533623 补丁。 直接判断补丁肯定是不靠谱的,因为还有其他几枚补丁(KB3063858、KB4457144)包含了这枚补丁。所以有没有什么靠谱写的判断方法呢?本文就来说说。 Windows...

如何让 .NET 程序脱离系统安装的 .NET 运行时独立运行?除了 Self-Contained 之外还有更好方法!谈 dotnetCampus.AppHost 的工作原理

从 .NET Core 3 开始,.NET 应用就支持独立部署自己的 .NET 运行时。可以不受系统全局安装的 .NET 运行时影响,特别适合国内这种爱优化精简系统的情况……鬼知道哪天就被优化精简了一个什么重要 .NET 运行时组件呢!然而,如果你的项目会生成多个 exe 程序,那么他们每个独立发布时,互相之间的运行时根本不互通。即便编译时使用完全相同的 .NET 框架(例如都设为 net6...

如何编译、修改和调试 dotnet runtime 仓库中的 apphost nethost comhost ijwhost

.NET 以 MIT 协议开源,于是任何人都可以尝试对其进行一丢丢的修改以实现一些原本很难实现的功能,例如在多个可执行程序(exe)之间共享同一个私有部署的 .NET 运行时。在这个例子中,我们修改了 AppHost 添加了一个可以定制 .NET 运行时路径的功能,这就需要我们能编译、修改和调试 dotnet/runtime 仓库里的 apphost 部分。 本文将以 dotnetCamp...

修改 .NET 运行时、框架和库,从编译 dotnet runtime 仓库开始

.NET 以 MIT 协议开源,于是任何人都可以尝试对其进行一丢丢的修改以实现一些原本很难实现的功能,例如在多个可执行程序(exe)之间共享同一个私有部署的 .NET 运行时。然而,对其的修改得能够编译生成期望的文件才行。本文介绍一下如何编译 dotnet/runtime 仓库,日常使用非常简单,所以如果只是轻微修改的话,本文大概就够了。 首先记得先把仓库拉下来: dotnet...

一文看懂 .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 位程序的大内存感...