取消

.NET Framework 4.x 程序到底运行在哪个 CLR 版本之上

当我们编译程序目标框架选为 .NET Framework 4.5/4.6/4.7/4.8 时,CLR 运行时是如何判断我们究竟应该用哪一个 .NET Framework 呢?.NET Framework 的版本到底由哪些部分组成?我们编译 .NET Framework 时选择的版本决定了什么? 让我对这个问题产生兴趣的原因是: 我将程序编译的目标框架选为 .NET Framewo...

使用 .editorconfig 配置 .NET/C# 项目的代码分析规则的严重程度

随着 Visual Studio 2019 更新,在 Visual Studio 中编写代码的时候也带来了基于 Roslyn 的代码质量分析。有一些代码分析严重程度可能与团队约定的不一致,这时就需要配置规则的严重程度。另外如果是个人使用插件安装了分析器,也可以配置一些严重程度满足个人的喜好。 本文介绍使用 .editorconfig 文件来配置 .NET/C# 项目中,代码分析规则的严重性...

什么是模态窗口?本文带你了解模态窗口的本质

做 Windows 桌面应用开发的小伙伴们对“模态窗口”(Modal Dialog)一定不陌生。如果你希望在模态窗口之上做更多的事情,或者自己实现一套模态窗口类似的机制,那么你可能需要了解模态窗口的本质。 本文不会太深,只是从模态窗口一词出发,抵达大家都熟知的一些知识为止。 开发中的模态窗口 在各种系统、语言和框架中,只要有用户可以看见的界面,都存在模态窗口的概念。从交互层面来...

直击本质:WPF 框架是如何实现模态窗口的

想知道你在 WPF 编写 Window.ShowDialog() 之后,WPF 框架是如何帮你实现模态窗口的吗? 本文就带你来了解这一些。 Window.ShowDialog WPF 显示模态窗口的方法就是 Window.ShowDialog,因此我们直接进入这个方法查看。由于 .NET Core 版本的 WPF 已经开源,我们会使用 .NET Core 版本的 WPF 源代码...

.NET/C# 检测电脑上安装的 .NET Framework 的版本

如果你希望知道某台计算机上安装了哪些版本的 .NET Framework,那么正好本文可以帮助你解决问题。 如何找到已安装的 .NET Framework 有的电脑的 .NET Framework 是自带的,有的是操作系统自带的。这样,你就不能通过控制面板的“卸载程序”去找到到底安装了哪个版本的 .NET Framework 了。 关于各个版本 Windows 10 上自带的 ...

Windows 系统上用 .NET/C# 查找所有窗口,并获得窗口的标题、位置、尺寸、最小化、可见性等各种状态

在 Windows 应用开发中,如果需要操作其他的窗口,那么可以使用 EnumWindows 这个 API 来枚举这些窗口。 你可以使用本文编写的一个类型,查找到所有窗口中你关心的信息。 需要使用的 API 枚举所有窗口仅需要使用到 EnumWindows,其中需要定义一个委托 WndEnumProc 作为传入参数的类型。 剩下的我们需要其他各种方法用于获取窗口的其他属性。 ...

在 WPF 程序中应用 Windows 10 真•亚克力效果

从 Windows 10 (1803) 开始,Win32 应用也可以有 API 来实现原生的亚克力效果了。不过相比于 UWP 来说,可定制性会差很多。 本文介绍如何在 WPF 程序中应用 Windows 10 真•亚克力效果。(而不是一些流行的项目里面自己绘制的亚克力效果。) API 需要使用的 API 是微软的文档中并未公开的 SetWindowCompositionAttr...

使用 SetWindowCompositionAttribute 来控制程序的窗口边框和背景(可以做 Acrylic 亚克力效果、模糊效果、主题色效果等)

Windows 系统中有一个没什么文档的 API,SetWindowCompositionAttribute,可以允许应用的开发者将自己窗口中的内容渲染与窗口进行组合。这可以实现很多系统中预设的窗口特效,比如 Windows 7 的毛玻璃特效,Windows 8/10 的前景色特效,Windows 10 的模糊特效,以及 Windows 10 1709 的亚克力(Acrylic)特效。而且这...

使用傲梅分区助手无损合并分区,无损调整分区大小

Windows 本身就提供了强大的磁盘和分区管理工具,一个是操作简单的“磁盘管理”,一个是功能强大的命令行版的“diskpart”。不过这两个都有一些限制,一是不能影响到系统文件,二是其修改的分区不能被应用程序占用(diskpart 可在下次重启时做到)。另外,系统为了管理工具操作的效率和正确性,也有一些功能没有开放。 DiskGenius 是个强大的工具,不过傲梅也很良心。本文介绍使用傲...

EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作)

Windows 系统在安装的时候,会自动为我们的磁盘划分一个恢复分区和一个 EFI 分区。如果后面不打算再用这些分区的时候,却发现无法删除。 本文将提供解决方法。 因为误操作会导致数据丢失,所以我将两种不同的解决方法分开成两篇文章以避免干扰: EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作) EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操...

EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操作)

Windows 系统在安装的时候,会自动为我们的磁盘划分一个恢复分区和一个 EFI 分区。如果后面不打算再用这些分区的时候,却发现无法删除。 本文将提供解决方法。 因为误操作会导致数据丢失,所以我将两种不同的解决方法分开成两篇文章以避免干扰: EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作) EFI 分区/恢复分区不可删除?你需要使用命令行了(全命令行操...

推荐几款连字字体,在代码编辑器中启用连字字体(Visual Studio Code)

启用转为编程设计的连字字体,可以给你的变成带来不一样的体验。 连字字体 微软随 Windows Terminal 设计了一款新的字体 Cascadia Code,而这是一款连字字体。 microsoft/cascadia-code: This is a fun, new monospaced font that includes programming ligatures...

如何在 Visual Studio 2019 中设置使用 .NET Core SDK 的预览版(全局生效)

.NET Core 3 相比于 .NET Core 2 是一个大更新。也正因为如此,即便它长时间处于预览版尚未发布的状态,大家也一直在使用。 Visual Studio 2019 中提供了使用 .NET Core SDK 预览版的开关。但几个更新的版本其开关的位置不同,本文将介绍在各个版本中的位置,方便你找到然后设置。 Visual Studio 2019 (16.3 及以上) ...

WPF 程序如何移动焦点到其他控件

WPF 中可以使用 UIElement.Focus() 将焦点设置到某个特定的控件,也可以使用 TraversalRequest 仅仅移动焦点。本文介绍如何在 WPF 程序中控制控件的焦点。 UIElement.Focus 仅仅需要在任何一个控件上调用 Focus() 方法即可将焦点设置到这个控件上。 但是需要注意,要使 Focus() 能够工作,这个元素必须满足两个条件: ...

使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点

制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就是通过各种父子窗口嵌套完成的,有大量窗口句柄,窗口之间形成父子关系。不过,对于 WPF 程序来说,一个独立的窗口实际上只有一个窗口句柄,窗口内的所有内容都是 WPF 绘制的。 如果你不熟悉 Win32 窗口中的父子窗口关系和窗口样式,那么很有可能遇到父子窗口之间“抢夺焦点”的问题,本文介绍如...

.NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。 本文介绍 Walterlv.WeakEvents 库来定义和使用弱事件。 系列博客: .NET/C# 利用 Walterlv.WeakE...

.NET 设计一套高性能的弱事件机制

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。网上有很多弱事件的 NuGet 包,不过仅仅支持定义事件的时候写成弱事件而不支持让任意事件变成弱事件,并且存在性能问题。 本文将设计一套弱事件机制,不止可以...

.NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)

弱引用是 .NET 引入的概念,可以用来协助解决内存泄漏问题。然而事件也可能带来内存泄漏问题,是否有弱事件机制可以使用呢?.NET 没有自带的弱事件机制,但其中的一个子集 WPF 带了。然而我们不是什么项目都能引用 WPF 框架类库的。网上有很多弱事件的 NuGet 包,不过仅仅支持定义事件的时候写成弱事件而不支持让任意事件变成弱事件,并且存在性能问题。 本文介绍 Walterlv.Wea...

C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?

在 .NET 中创建进程时,可以传入 ProcessStartInfo 类的一个新实例。在此类型中,有一个 UseShellExecute 属性。 本文介绍 UseShellExecute 属性的作用,设为 true 和 false 时,分别有哪些进程启动行为上的差异。 本质差异 Process.Start 本质上是启动一个新的子进程,不过这个属性的不同,使得启动进程的时候会调...

.NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃

在 .NET Framework 4.8 中,try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃。而 .NET Core 3.0 中不会出现这样的问题。 本文涉及的 Bug 已经报告给了微软,并且得到了微软的回复。是 .NET Framework 4.8 为了解决一个安全性问题而强行结束了进程。 This post is written in multipl...

如何在 WPF 中获取所有已经显式赋过值的依赖项属性

获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。 本文介绍如何获取以及显式赋值过的依赖项属性。 需要用到 DependencyObject.GetLocalValueEnumerat...

在 WPF 中获取一个依赖对象的所有依赖项属性

本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性。 通过 WPF 标记获取 public static IEnumerable<DependencyProperty> EnumerateDependencyProperties(object element) { if (element is null) { throw new...

临时编写和调试 C++ 代码?用 VSCode 就够了!一分钟搭好 C++ 调试环境

突然间要编写或者调试几个 C++ 的小程序,动用 Visual Studio 创建一个解决方案显得大了些。如果能够利用随时随地就方便打开的 Visual Studio Code 来开发,则清爽很多。 本文教你一分钟在 Visual Studio Code 中搭建好 C++ 开发环境。 本文大纲 本文总共分为三个步骤,每个步骤都非常简单。 第一步:安装扩展 你需要在 Visu...

在使用 .NET Remoting 技术开发跨进程通信时可能遇到的各种异常

在使用 .NET Remoting 开发跨进程应用的时候,你可能会遇到一些异常。因为这些异常在后验的时候非常简单但在一开始有各种异常烦扰的时候却并不清晰,所以我将这些异常整理到此文中,方便小伙伴们通过搜索引擎查阅。 连接到 IPC 端口失败: 系统找不到指定的文件 System.Runtime.Remoting.RemotingException:“连接到 IPC 端口失败...

.NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态

在 Windows 系统中,一段时间不操作键盘和鼠标,屏幕便会关闭,系统会进入睡眠状态。但有些程序(比如游戏、视频和演示文稿)在运行过程中应该阻止屏幕关闭,否则屏幕总是关闭,会导致体验会非常糟糕。 本文介绍如何编写 .NET/C# 代码临时阻止屏幕关闭以及系统进入睡眠状态。 Windows API 我们需要使用到一个 Windows API: /// <summary&...

WPF 不要给 Window 类设置变换矩阵(分析篇):System.InvalidOperationException: 转换不可逆。

最近总是收到一个异常 “System.InvalidOperationException: 转换不可逆。”,然而看其堆栈,一点点自己写的代码都没有。到底哪里除了问题呢? 虽然异常堆栈信息里面没有自己编写的代码,但是我们还是找到了问题的原因和解决方法。 异常堆栈 这就是抓到的此问题的异常堆栈: System.InvalidOperationException: 转换不可逆。 ...

WPF 不要给 Window 类设置变换矩阵(应用篇)

WPF 的 Window 类是不允许设置变换矩阵的。不过,总会有小伙伴为了能够设置一下试图绕过一些验证机制。 不要试图绕过,因为你会遇到更多问题。 试图设置变换矩阵 当你试图给 Window 类设置变换矩阵的时候,会出现异常: System.InvalidOperationException:“转换对于 Window 无效。” 无论是缩放还是旋转,都一样会出现异常。...

通过设置启用 Visual Studio 默认关闭的大量强大的功能提升开发效率

使用 Visual Studio 开发 C#/.NET 应用程序,以前有 ReSharper 来不足其各项功能短板,后来不断将 ReSharper 的功能一点点搬过来稍微好了一些。不过直到 Visual Studio 2019,才开始渐渐可以和 ReSharper 拼一下了。 如果你使用 Visual Studio 2019,那么像本文这样配置一下,可以大大提升你的开发效率。 工...

C#/.NET 中 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 不同的执行效果和用法建议

在 C#/.NET 中,有 Thread.Sleep(0), Task.Delay(0), Thread.Yield(), Task.Yield() 中,有几种不同的让当前线程释放执行权的方法。他们的作用都是放弃当前线程当前的执行权,让其他线程得以调度。但是他们又不太一样。 本文说说他们的原理区别和用法区别。 原理区别 Thread.Sleep(0) Thread.Sleep...

WPF 的 Application.Current.Dispatcher 中,为什么 Current 可能为 null

在 WPF 程序中,可能会存在 Application.Current.Dispatcher.Xxx 这样的代码让一部分逻辑回到主 UI 线程。因为发现在调用这句代码的时候出现了 NullReferenceException,于是就有三位小伙伴告诉我说 Current 和 Dispatcher 属性都可能为 null。 然而实际上这里只可能 Current 为 null 而此上下文的 Di...