lindexi

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

林德熙

使用 DISM 安全清理 C 盘 WinSxS 文件夹空间

本文将介绍如何使用系统内置 DISM 工具进行安全清理 C 盘空间,清理 WinSxS 文件夹里面的可回收删除的程序包空间

修复 GitLab 的 CI Runner 提示找不到 pwsh 执行文件

本文告诉大家如何修复使用 GitLab 的 Runner 做 CI 时提示 “pwsh”: executable file not found in %PATH% 错误

修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败

通过在 WPF 项目上安装 WindowsAppSDK 库,可以让 WPF 使用上 Win10 及以上版本提供的 Windows Runtime 强大的 API 集和使用上更多的黑科技。本文记录在安装 WindowsAppSDK 库之后,项目生成失败,提示 NETSDK1082 和 NETSDK1112 错误的问题,和修复的方法

解决 System.Net.Sockets.SocketException 10045 参考的对象类型不支持尝试的操作 无法联网

本文收集 System.Net.Sockets.SocketException 异常错误码为 10045 导致无法联网的问题

聊聊 dotnet 7 对 bool 与字符串互转的底层性能优化

本文也叫 跟着 Stephen Toub 大佬学性能优化系列。大家都知道在 .NET 7 有众多的性能优化,其中就包括了对布尔和字符串互转的性能优化。在对布尔和字符串的转换的性能优化上,有着非常巧妙的思路,值得写篇博客记录

使用 Uno Islands 在现有 WPF 里面嵌入 Uno 框架

随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用。通过此方式可以辅助在现有的 WPF 项目里面,部分功能迁入 Uno 项目,或者是某些新开发功能通过 Uno 实现,从而利用 Uno 跨平台的能力,逐个功能点支持跨平台功能。逐个小功能接入的方式,让开发者不需要为一次性迁移一个庞大的项目而烦恼

解决 System.Net.Sockets.SocketException 10106 无法加载或初始化请求的服务提供程序 无法联网

本文收集 System.Net.Sockets.SocketException 异常错误码为 10106 导致无法联网的问题

尝试 IIncrementalGenerator 进行增量 Source Generator 生成代码

在加上热重载时,源代码生成 Source Generator 的默认行为会让 Visual Studio 有些为难,其原因是热重载会变更代码,变更代码触发代码生成器更新代码,代码生成器更新的代码说不定又会有某些逗比逻辑再次触发热重载。于是就会发现在某些复杂的项目下,开启热重载之后,在编辑并继续界面将会等非常久,甚至再也无法继续。为了解决这个问题,大聪明设计了 Incremental Generators 机制,此 Incremental Generators 机制和 Source Generator 不冲突,被设计用来解决热重载的源代码生成性能问题,本文将告诉大家此新的 API 的入门级使用

读 MAUI 源代码 理解可绑定对象和可绑定属性的存储机制

和 UWP 与 WPF 不同的是在 MAUI 里面,使用可绑定对象 BindableObject 替换了依赖对象的概念,我阅读了 MAUI 的源代码发现其实只是命名变更了,里面的机制和设计思想都是差不多的。在 MAUI 里面提供 BindableObject 用来支持可绑定属性机制和附加属性机制,本文将告诉大家在 MAUI 里面是如何在可绑定对象里面提供可绑定属性和附加属性的存储的机制

关于多个 Cookie 的分隔符这件事

对于 Cookie 的处理上,我最近遇到一个问题,那就是如何分割 Cookie 的内容。有人说是使用逗号分割,有人说是使用分号分割,究竟用哪个才是对的?其实这个答案是需要分为两个过程,分别是请求和响应,来进行回答。请求过程的 Cookie 和响应返回的 Cookie 的格式是不相同的

修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹

本文告诉大家如何修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹的问题。如果 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹,那将会在调试的时候,由于找不到 PDB 符号文件而加载符号失败

用 SetWindowPos 方法设置一个停止响应的窗口将卡调用方

我使用 User32 的 SetWindowPos 方法去设置一个跨进程的窗口,这个窗口是停止响应的,将让调用的 SetWindowPos 方法卡住,不继续执行逻辑。通过堆栈分析是卡在 NtUserSetWindowPos 方法上,调用 SetWindowPos 方法不返回

支持 dotnet 6 的 dnSpy 神器版本

官方的 dnSpy 在 2021 时,由于某些吃瓜的原因 wtfsck 将 dnSpy 给 Archived 掉,在大佬被哄好之前,预计是不再更新。最新官方版本对 dotnet 6 的支持较弱,对于很多 dotnet 6 应用都无法成功调试,附加调试上去将会让应用卡住。好在 dnSpy 是开源的,也刚好 lsj 大佬改得动,于是改了一个支持 dotnet 6 的版本

读书笔记 为什么要有R5G6B5颜色格式

在 Windows 下,颜色的格式有很多,我好奇为什么要设计出 R5G6B5 这样的格式?通过阅读一些书和官方的文档,似乎了解了为什么,我在本文记录一下

win10 uwp 选择文本转语音的机器人

在 UWP 里,可以非常方便将某个文本转换为音频语音,转换时,将会根据输入的内容以及本机所安装的语言库选择一位机器人帮忙将输入的文本转换为语音。本文来告诉大家如何切换文本转语音的机器人,例如从默认的女声转换为男声,如选择 Kangkang 或 Huihui 等特定机器人帮助转换语音

修复 SmartAssembly 混淆 .NET 6 时提示 Unable to load runtime config file 失败

本文告诉大家如何修复使用 SmartAssembly 7.5 混淆 .NET 6 应用时提示 Unable to load runtime config file 失败

使用 Silk.NET 创建 OpenGL 空窗口项目例子

本文告诉大家如何使用 Silk.NET 创建 OpenGL 空窗口项目。在 dotnet 基金会下,开源维护 Silk.NET 仓库,此仓库提供了渲染相关的封装逻辑,包括 DX 和 OpenGL 等等的封装,利用此封装可以用来代替原有的 SharpDx 等库。这是一个全新写的项目,使用上了 dotnet 和 C# 很多新的特性,相对来说也很活跃,我准备开始入坑这个项目

迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台

我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则必须将目标平台设置为 Windows 平台。但是我不想让此项目绑定到 Windows 平台上,不在 TargetFramework 上修改为 net6.0-windows 框架

关闭 SublimeText 3.2.2 Build 3211 的拼写检查

在更新 SublimeText 之后,发现所有的字符下面都有波浪线,这是新版本的 SublimeText 提供的拼写语法功能,然而我不需要此功能。本文来告诉大家如何关闭

读书笔记 dotnet 的字符串在内存是如何存放

本文是读伟民哥翻译的 .NET内存管理宝典 这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解。在阅读到 string 在内存的布局时,我看到 RuntimeHelpers 的 OffsetToStringData 数据,据说此属性可以获取到字符串的字符在内存存放的实际地址,本文将来写一个混合 C# 和 C++\CLI 的应用来进行测试

非技术 基于 VR 虚拟世界开展虚拟资产的玩法

本文来告诉大家我所想到的基于 VR 等虚拟世界开展的虚拟资产的玩法,数字资产的交易。此玩法可以对标比特币等虚拟的货币,说不定未来世界真的有人做出了本文设想的这一套游戏规则出来

win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑

本文来告诉大家如何通过 Win2d 完全控制笔迹绘制逻辑,本文适合用来实现复杂的自定义逻辑,可以完全控制笔迹的行为。包括在书写过程中切换模式,如进行手势擦除切换为橡皮擦模式

使用 FastTunnel 做内网穿透远程计算机桌面服务器

FastTunnel是一款高性能跨平台内网穿透工具,使用它可以实现将内网服务暴露到公网供自己或任何人访问。对比市面上的其他内网穿透工具最大优势在于基于 dotnet 编写,提供二次开发扩展能力。本文将来告诉大家,在不做任何编程的情况下,通过 FastTunnel 工具,让我某台内网的 Windows 电脑,开启远程桌面服务,提供外网连入的能力

听龙华讲公共组件 CBB 建设笔记

这篇博客在我的草稿从 2017 放到现在,我做了三年的公共组件,我觉得我现在能来发布这篇笔记。本文将来和大家讲龙华大佬告诉我的公共组件 CBB 建设相关知识

希沃白板断网环境免登陆编辑课件

希沃白板是依靠云来实现同步编辑的功能,默认的编辑功能需要在有网络的情况下,才能很好的进行。如果我的网络断了,或进入了没有网络的无网环境,因为没法登录希沃白板的原因,无法编辑我的课件。本文来告诉大家简单的解决方法,通过希沃白板免登陆插件,实现免登陆进入希沃白板的编辑界面,编辑本地的课件

让 dotnet 命令行输出作为英文的方法

在我的设备上,默认的 dotnet 命令行都是输出中文,如我输入 dotnet build 命令,里面的错误提示也是中文。在我想要和国外的小伙伴报坑时,如果里面有很多中文,我觉得他将会看不懂,从而不理我。本文来告诉大家如何让 dotnet 的命令行输出英文,从中文切换语言为英文

考古 dotnet 的不同版本

本文来考古一下 dotnet 发布过的版本,相信本文里面有很多个版本都是大家很少听过的

我写的逗比代码

本文记录我写的代码逗比代码

通过 COM 读取 Office PPT 文件提示 COMException 错误码 0x80004005 可能原因

使用 COM 的方式可以调用本机的 Office 组件进行 PPT 以及 Word 和 Excel 等文件的读写,在打开文件的时候,如果提示 System.Runtime.InteropServices.COMException (0x80004005) 就意味着这是一个通用的错误,没有具体的原因

非技术 技能知识和资讯

我认识了很多开发者伙伴,大部分的伙伴都不擅长聊天,但我知道他的技术很强,而且不同的伙伴技术强的方面都不相同,刚好我参加了集团的一点培训,了解了技能和知识和资讯的差别,于是记录在本文

用于辅助做二分调试的构建每个 commit 的工具

在日常开发调试中,有一个超级调试方法,二分调试。二分调试可以用来辅助调试在某个版本是好的,但现在是坏的问题。或者说用来辅助定位某个问题是啥时候写出来的。二分调试的做法就是尝试每个版本的代码构建出来的应用,看这个版本的应用是否符合有坑,当然为了提升效率,就采用了二分算法,不需要每个 commit 版本的代码都构建。本文提供了一个工具用来辅助构建每个 commit 版本的代码,将构建输出的应用保存到自定义的某个文件夹,用来在进行二分调试的时候,不需要重新构建一次

如何让 Gitlab 的 Runner 在构建时拉取 Git Submodules 仓库

默认的 GitLab 的 Runner 在构建时不会去拉取 Git Submodules 仓库,将会提示 Skipping Git submodules setup 跳过初始化 Git Submodule 仓库

搭建一个自动化分析 DUMP 平台

本文来告诉大家如何一步步搭建一个 DUMP 分析平台,核心是用来分析桌面端的应用软件,如 WPF 软件的 DUMP 文件。在开始之前需要说明的是,如果桌面端软件使用纯 WPF 实现,中途没有调用不安全的 C++ 库,那么 DUMP 平台几乎无用,原因是 WPF 是 .NET 应用,而 .NET 是安全的,除非是系统环境问题,否则依靠捕获异常所拿到的信息就完全超过了 DUMP 能获取的信息。因此本文的核心功能是提供给调用了不安全的 C++ 等语言编写的库的桌面端软件 DUMP 分析平台

创建CBB心得

本文来和大家分享制作 CBB 公共组件的一些心得

升级到 dotnet core 之后 HandleProcessCorruptedStateExceptions 无法接住异常

这是 dotnet core 的破坏性改动之一,在 dotnet framework 里面,可以使用 HandleProcessCorruptedStateExceptionsAttribute 接住非托管层抛出的异常,如 C++ 异常等。但是这个功能在 dotnet core 下存在行为的变更,从 .NET Core 1.0 开始,损坏进程状态异常无法由托管代码进行处理。 公共语言运行时不会将损坏进程状态异常传递给托管代码