lindexi

林德熙 - 微软最具价值专家和 .NET 基金会成员

林德熙

Office 已知问题 GROOVEEX.DLL 带崩进程

这是一位老师向我反馈的问题,我的一个 WPF 应用程序在他的设备上,任何弹出保存文件对话框或打开文件对话框的功能,都会导致进程闪退。经过进一步调查,我发现他电脑上任何软件弹出文件保存对话框都会闪烁,问题本身和 WPF 无关。最终调查到是 Office 的一个注入组件导致的问题

dotnet 10 已知问题 WinForms 的 TargetFramework 与 System.Drawing.Common 不匹配将抛出找不到类型异常

本文记录 dotnet 10 新引入的问题。如果 TargetFramework 是 .NET 9 版本,而引用的 System.Drawing.Common 包是 10.0 版本,那么运行程序时,可能抛出找不到类型异常

DirectWrite 通过 GetUnicodeRanges 获取字体能支持的字符范围

一个字体文件只能支持有限的字符数量,为了能够知道某个字体包含哪些字符,可通过 DirectWrite 提供的 GetUnicodeRanges 方法获取。本文将演示如何从 IDWriteFontFace 的 GetUnicodeRanges 方法获取字体能支持的字符范围以及对比 WPF 的行为

dotnet 制作一个简单的自动更新系统日期时间工具

本文和大家介绍我制作的一个简单的开机自启的自动更新系统日期时间工具

WPF 使用 DisplayConfigGetDeviceInfo 获取显示器名的方法

本文将和大家介绍在 WPF 里面调用 Win32 的 DisplayConfigGetDeviceInfo 获取显示器名的方法

dotnet C# X11 开发笔记

本文记录我学习开发 X11 应用的笔记

C# 浮点数 double 的 IsFinite IsNormal IsRealNumber 分不清楚

在 dotnet 的 double 或 float 浮点数里有很多个辅助方法用于判断状态,如是否无效值或无穷。这些方法含义不相同,让我比较混淆,于是我就尝试记录一篇博客说清楚这些方法的含义

dotnet C# 主构造函数带来的虚属性优势

在基类里面使用虚属性,在构造函数调用抽象或虚方法时,一个令开发者烦恼的点在于调用的抽象或虚方法可能访问到子类还没赋值的属性,导致出现空异常

WPF Application Compatibility switches list

This is a list of all System.AppContext base application compatibility switches present in WPF today, along with their defaults and related documentation.

IIncrementalGenerator 增量 Source Generator 生成代码入门 读取 csproj 项目文件的属性配置

本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,读取项目里的项目文件属性,从而实现为项目定制的逻辑。或者是读取 NuGet 包里面的一些配置,从而方便实现逻辑

为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试

本文属于 IIncrementalGenerator 增量 Source Generator 源代码生成入门系列博客,本文将和大家介绍如何为源代码生成项目添加单元测试

IIncrementalGenerator 如何在源代码生成器单元测试提供 AnalyzerConfigOptionsProvider 选项

本文属于 IIncrementalGenerator 增量 Source Generator 源代码生成入门系列博客,本文将和大家介绍如何为源代码生成项目添加的单元测试里面提供 AnalyzerConfigOptionsProvider 选项

dotnet 10 已知问题 构建 WPF 时提示 System.Private.Windows.GdiPlus 程序集未找到错误

本文记录 dotnet 10 的已知问题,将会导致 WPF 项目构建的时候给出错误

dotnet C# 警惕结构体加等事件

前几天我在对文本库进行性能优化,将其中一个枚举迭代器从类改成结构体,然而改造之后却遇到了本文记录的在结构体内加等事件的坑

Skia 在龙芯搭景嘉微显卡设备 某些字体会渲染相互覆盖

此问题是先在 Avalonia 应用上发现的,后续调查了解到是 Skia 底层的问题。本文将记录此问题和提供规避方法

WPF 讲讲 Microsoft.NET.Sdk.WindowsDesktop 的原理

在使用 .NET Core 3.0 和以上版本,可以使用新的 SDK 版本支持的 csproj 项目文件,这个 SDK 格式的项目文件可以支持 .NET Core 以及 .NET Framework 版本的 WPF 核心就是在 csproj 项目的第一句话。本文就来和大家聊这个 Microsoft.NET.Sdk.WindowsDesktop 的原理

dotnet 读 WPF 源代码 学习使用 Microsoft.DotNet.Arcade.Sdk 处理代码里的多语言

在 WPF 开源代码里面,可以看到是从各个项目的 Strings.resx 和对应的 xlf 文件,生成对应项目的多语言程序集。这里的多语言程序集可用于抛出异常时,给出本地化的消息提示

开源项目

这是我收藏的开源项目

ASP.NET Core 制作一个低资源占用的支持超大文件表单上传的服务

故事的背景是我准备制作一个签名服务,为打包构建之后的产物文件进行签名和对其内容信息进行扫描。在这个过程里面,我需要搭建一个 ASP.NET Core 服务,这个服务要能承载客户端上传的超大文件表单,且预算有限,此服务占用资源要足够低

WPF 已知问题 使用 WindowChrome 在切换系统主题色时导致窗口界面偏移

本文记录 WPF 的一个已知问题,设置窗口的 WindowChrome 的 NonClientFrameEdges 属性之后,当切换系统主题或主题色时,将可以看到窗口界面内容偏移或跳动闪烁现象

SignTool 使用 SafeNet eToken 硬证书进行代码签名

现在软件代码签名已经不能用 pfx 软证书了,需要搭配 FIPS140-2 Level2、Common Criteria EAL4级以上或者同等认证级别的硬件,如 USB 令牌、硬件安全模块 HSM 等才能完成签名

C# 使用 using 关键字间接实现只读局部变量的方法

众所周知,在 C# 里面是没有只读局部变量的功能的。但有趣的 C# 语法让咱可以使用现有的 using 关键字间接实现只读局部变量

拼音输入法 快速输入带音调的字符

本文告诉大家如何使用本文提供的输入法快速输入带音调的字符

dotnet core 编程规范

本文实质为翻译 .NET Core foundational libraries 官方文档的编码风格。

WPF 开发自动开机启动程序

本文告诉大家如何在 WPF 开发一个可以自动启动的程序

读 WPF 源代码 了解获取 GlyphTypeface 的 CharacterToGlyphMap 的数量耗时原因

在我的一次应用性能分析中,我发现了尝试获取 GlyphTypeface 的 CharacterToGlyphMap 属性的数量时,存在很大的耗时。经过阅读 WPF 源代码,我了解到了其中的原因,本文将和大家从底层源代码分析原因和给出解决方法

WPF 通过 WriteableBitmap 实现 TAGC 低光增强效果算法

我在寻找将一些拍摄出来的比较暗的图片进行光亮增强的算法,用于处理我出门拍的一些照片。我从博客园找到了 Imageshop 大佬记录的伊拉克团队的TAGC(低光增强效果)算法实现,通过阅读大佬的博客和对应的论文,基于 WPF 的 WriteableBitmap 实现 TAGC 低光增强效果算法

WPF 的 WriteableBitmap 在 Intel 11 代 Iris Xe Graphics 核显设备上停止渲染

在 Intel 11 代锐炬 Intel® Iris® Xe Graphics 核显设备上,如果此设备使用旧版本驱动,则可能导致 WPF 的 WriteableBitmap 停止渲染。此问题和 WPF 无关,此问题是 Intel 的 bug 且最新驱动版本已修复

WPF 触摸相关

本文整理我写的和我收集的触摸博客

WPF 警惕 StylusPlugIn 的多线程安全问题

在 WPF 里面,可以通过 StylusPlugIn 直接从触摸线程获取触摸消息,不需要经过 UI 线程。如此可以实现更低的触摸延迟。但是 StylusPlugIn 的 OnStylusDown\Move\Up 方法都可能是从触摸线程或 UI 线程调入,需要警惕这里的多线程安全问题

dotnet C# 如何修改异常的堆栈

异常的堆栈信息,通常都是在抛出的时候自动记录当前的异常堆栈信息。在某些特殊情况下,期望修改异常堆栈,此时需要用到 dotnet 内置的 ExceptionDispatchInfo 机制

WPF 已知问题 开启 WM_Pointer 消息之后 获取副屏触摸数据坐标偏移

本文记录 WPF 触摸的一个已知问题,仅在开启 WM_Pointer 消息之后,将应用程序运行在包含多个屏幕的带触摸屏的设备上,如此时在非主屏幕的触摸屏上进行触摸,使用 GetStylusPoint 或 GetIntermediateTouchPoints 方法获取触摸点时,将会发现所获取的触摸点的坐标是偏的,偏的坐标差值刚好是整个屏幕距离

WPF 性能测试

本文收藏我给 WPF 做的性能测试。在你开始认为 WPF 的性能存在问题的时候,不妨来这篇博客里找找看我做过的测试。我记录的测试都是比较纯净的测试项目,没有业务逻辑的干扰,写法也正常,可以更加真实反映 WPF 的性能,减少因为奇怪的业务逻辑以及逗比的写法的影响

Windows 通过编辑注册表设置左右手使用习惯更改 Popup 弹出位置

本文告诉大家如何在通过更改注册表的设置,从而更改平板电脑设置 Tablet PC Settings 的左右手使用习惯 Handedness 的惯用左手和惯用右手选项

dotnet 配合 GitHub 的 Action 做自动推 Tag 时打包 NuGet 包

被微软收购的 GitHub 越来越好用,拥有大量免费的工具资源和构建服务器资源,再加上私有项目的无限制使用,我有大量的项目都在向 GitHub 迁移。通过 GitHub 的 Action 的自动构建,可以用上微软土豪的服务器资源,进行自动化测试和构建。对于 CBB 来说,发布就是打出 NuGet 包然后上传到内部 NuGet 服务器。此时遇到的问题是,如何在 GitHub 上执行打包,打包的时候如何指定 NuGet 包的版本号。因为 CBB 的特殊性,我要求每个 NuGet 正式发布的包都应该有一个对应的 Tag 号,这样将 NuGet 库安装到项目里面,之后发现问题了还能找到对应版本的代码