dotnet 文档应用的撤销重做设计 文档应用是指如 Word 或 PPT 等的提供给用户进行内容创作的工具,而撤销重做其实也被称为撤销恢复功能。本文来告诉大家撤销重做这个模块的设计路线,从简单的复杂大部分的应用软件都可以采用敏捷开发,不断进行迭代。应用的每个小功能都在不断迭代中,成为模块或者某个团队产品。撤销重做功能也是可以从一个小功能,迭代成为一个文档的核心模块在软件开始开发的时候,很少会有人能了解这个软件产品的未来,如果...
dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 后台线程创建 WriteableBitmap 锁住主线程 在 WPF 中,如果在没有开启 Dispatcher 的后台线程里面创建 WriteableBitmap 对象,在 WriteableBitmap 构造函数传入在主线程创建的 BitmapSource 也许就会锁住主线程。本文将通过 WPF 框架源代码告诉大家为什么会锁住主线程这是在 WPF 开源仓库上一个小伙伴报的,详细请看 WriteableBitmap hangs when sourc...
非技术 技能知识和资讯 我认识了很多开发者伙伴,大部分的伙伴都不擅长聊天,但我知道他的技术很强,而且不同的伙伴技术强的方面都不相同,刚好我参加了集团的一点培训,了解了技能和知识和资讯的差别,于是记录在本文有一些伙伴属于技能强,但是知识薄弱。有一些伙伴属于资讯了解很多,但知识没有了解多少。有一些伙伴知识储备很足,但是没有啥技能技能其实指的是非记和背能了解的知识,大概和做数学题的效果差不多,在开发里面,可以认为是技能...
dotnet C# 代码获取系统日志 可以使用 EventLog 静态类读取或写入系统日志如下面代码可以读取本机的系统日志 static void Main(string[] args) { foreach (var eventLog in EventLog.GetEventLogs()) { foreach (Eve...
希沃白板如何在公式里面输入绝对值符号 在希沃白板中,可以很方便使用学科工具里面的公式工具,在希沃白板画布中插入公式元素。本文来告诉大家如何在希沃白板的公式工具中,插入带绝对值符号的公式在希沃白板的公式工具里面,默认会显示很多基础符号,但是在基础符号里面,没有绝对值符号 | 符号,因为这个符号可以通过键盘输入在默认的标准键盘里面,可以在键盘找到 |\ 这个按键符号,如下图。默认按下是 \ 符号,在键盘中按住 Shift 键之...
dotnet 读 WPF 源代码笔记 创建 SolidColorBrush 性能没有想象那么差 在 WPF 中,常用的画刷里面有纯色画刷 SolidColorBrush 类。因为画刷会对应到 DirectX 的资源,因此之前我以为纯色画刷其实会比 Color 会占用更多的资源。在 WPF 中 Color 其实是结构体,创建速度快。而 SolidColorBrush 是画刷,会对应 DirectX 资源,相对来说性能会比较差。但在通过阅读 WPF 的源代码,发现其实 SolidColorBru...
WPF 将 SVG 转 XAML 的工具 团队的设计师喜欢输出 SVG 格式的图片,而咱如果想要在 WPF 中高性能呈现出来,最好还是转换为 XAML 代码。本文来安利大家一些 SVG 转 XAML 的工具本文将按照推荐的顺序,最前面的是最推荐的,来告诉大家一些工具SharpVectors这是名气很大的工具,当然这也是一个库。通过这个库可以在 dotnet 系的客户端应用,如 WPF 和 UWP 等呈现 SVG 内容,这个库里面...
WPF 使用 Behavior 库辅助获取动态资源变更事件 在 WPF 开发中,可以使用 Behavior 库辅助,监听某个动态资源变更的事件,从而了解到是在哪个模块变更了动态资源,或者根据动态资源的变更而进行界面修改在 WPF 的动态资源机制里面,如果某个依赖属性给定了动态资源,那么在动态资源变更的时候,将会重新给属性赋值。通过这个机制,就可以在业务逻辑上,通过添加一个依赖属性,绑定到需要监听变更的动态资源上,那么这个依赖属性将会收到变更通知在...
WPF 给 Grid 的辅助方法 添加行列名称绑定 有一些设计师喜欢改改改,界面的整体布局总是变更,如给 Grid 加一列删一行等,每次这样的更改的时候,都需要小心修改 Grid 里面的元素设置的行列序号。我认为在 Grid 简单的时候,当然大多数时候都应该让 Grid 不那么复杂,那么序号的可读性不错。如果 Grid 行列数量比较多,那么此时行列的序号的可读性将会降低,本文来告诉大家一个简单的方法,可以给 Grid 的行列添加名称绑定,让元素绑定...
用于辅助做二分调试的构建每个 commit 的工具 在日常开发调试中,有一个超级调试方法,二分调试。二分调试可以用来辅助调试在某个版本是好的,但现在是坏的问题。或者说用来辅助定位某个问题是啥时候写出来的。二分调试的做法就是尝试每个版本的代码构建出来的应用,看这个版本的应用是否符合有坑,当然为了提升效率,就采用了二分算法,不需要每个 commit 版本的代码都构建。本文提供了一个工具用来辅助构建每个 commit 版本的代码,将构建输出的应用保存到自...
Windows 下的 WPF 开发 调试应用程序在什么时机加载了 Dll 模块 在尝试优化性能的时候,如何可以了解到在应用程序启动的过程中,在什么步骤开始加载了某些 Dll 文件在 VisualStudio 的 调试->窗口->模块 可以看到当前应用程序加载的所有模块,也就是应用程序加载了哪些 Dll 文件一个调试方法是在合适的逻辑里面添加断点,或者在软件启动完成之后,通过模块了解应用程序加载了哪些 DLL 文件,从而了解应用程序启动慢是否因为加载了不应该...
dotnet 修复 ILLinkTasksAssembly 特性的值的计算结果无效 在加上 IL Link 的项目里面,在升级到 .NET 6 预览版,有一些项目将会构建不通过,或者有些 C++ CLI 项目加载失败。提示 元素 UsingTask 中“AssemblyFile”特性的值“$(ILLinkTasksAssembly)”的计算结果“”无效。原因就是 .NET 6 预览版里面,或者自己的设备上 ILLinkTasksAssembly 属性定义失效解决方法是先创...
dotnet 桌面端基于 AppHost 的配置式自动切换更新后的应用程序路径 在桌面应用端开发的时候,应用更新有很多实现方式,本文来告诉大家一个基于 dotnet core 或 .NET 5 的 AppHost 方式的配置式软件更新方法。这个方法的特点是入口的 Exe 文件可以固定不动,每次更新的时候只需要更新某个配置文件的路径,即可实现在应用启动的时候,读取配置文件的路径加载某个版本的软件跑起来。而且本文的方法不需要额外其他一个独立的启动进程,而是入口文件进程就是最终的 ...
dotnet OpenXML 图片特效的 Color Change Effect 特效修改图片颜色 在 Office 中,如 PPT 和 Word 可以不对原图修改的前提下,通过叠加特效的方式,提供对图片的视觉输出进行修改的方法,本文将介绍 ECMA 376 里面的 第 20.1.8.16 章的 ClrChange (Color Change Effect) 的用法和功能。日常这个特效用来去背景如下图是一张图片,这张图片有背景色,这张图片是我瞎找的,如果有版权问题还请告诉我默认放入到...
dotnet OpenXML 图片特效的 BiLevel 黑白特效修改图片颜色 在 Office 中,如 PPT 和 Word 可以不对原图修改的前提下,通过叠加特效的方式,提供对图片的视觉输出进行修改的方法,本文将介绍 ECMA 376 里面的 第 20.1.8.11 章的 Bi-Level (Black White Effect) 的用法和功能如下图是一张图片,这张图片有颜色的,这张图片是我瞎找的,如果有版权问题还请告诉我默认放入到 PPT 里面的效果如下...
如何让 Gitlab 的 Runner 在构建时拉取 Git Submodules 仓库 默认的 GitLab 的 Runner 在构建时不会去拉取 Git Submodules 仓库,将会提示 Skipping Git submodules setup 跳过初始化 Git Submodule 仓库如官方文档 的描述,只需要加上以下代码在 .gitlab-ci.yml 文件即可variables: GIT_SUBMODULE_STRATEGY: recursive # 拉...
dotnet 使用 ShowMeTheXAML 显示 WPF 的 XAML 控件内容 本文来告诉大家一个好用的控件库,这个控件库可以方便用在自己编写示例项目中使用。使用 ShowMeTheXAML 控件库可以将某段 XAML 内容作为字符串文本内容显示出来,方便让其他开发者看到界面以及对应的内容此控件库 ShowMeTheXAML 不仅支持 WPF 同时也支持 UNO 项目使用此控件的界面逻辑大概如下 <showMeTheXaml:XamlDisplay Uniq...
dotnet 读 WPF 源代码笔记 默认的 Main 函数是在哪创建的 在使用默认的 WPF 项目开发的时候,咱是不需要自己编写 Main 函数的,在 WPF 中的 Main 函数是存放在 App.g.cs 里面,看起来这个 Main 函数是生成的函数,本文将介绍在 WPF 框架中是如何创建这个入口函数阅读本文你将了解 WPF 框架中,默认在 App.g.cs 生成入口 Main 函数的详细过程。阅读本文之前,你需要了解一些编译过程的知识以及代码生成的知识默...
VisualStudio 外部工具配合 dotnet tool 制作复制文件名工具 我在 VisualStudio 中,为了方便沟通,我需要复制当前文件的文件名,不包含本地的路径,但是我没有找到一个好的复制方式,每次都是复制完全的路径,然后再删除部分的功能。为了提高效率,于是我就自己使用 .NET Core 制作了一个 dotnet 工具,让 VisualStudio 的自定义外部工具配合 dotnet tool 加上传入参数实现通过按下快捷键即可复制当前标签页对应的文件名。实现...
dotnet 在 Windows 系统上使用 stakx 的 WIC 库 在 Windows 系统上,有一个很重要的概念是 Windows Imaging Component 也就是 WIC 层,这是专门用来处理多媒体相关的系统组件,特别是用来处理图片相关,包括编码和解码和处理图片。默认在 WPF 中就可以使用封装好的 WIC 层,也就是说最好的 WIC 库就是 WPF 框架了。但是如果在 WPF 之外呢,我有一点特别的需求,我想要绕过 WPF 框架,通过纯控制台的方式...
VisualStudio 2019 调试项目使用 Portable PDB 提示不支持 PDB 格式 在新的 .NET 上,将会默认使用 Portable PDB 符号格式,而如果 VisualStudio 配置了使用托管兼容模式,那么将在加载符号的时候,将会提示不支持 PDB 格式在发现自己的代码因为没有加载符号而断点无法命中提示当前不会命中断点,还没有为该文档加载任何符号,就应该通过 调试->窗口->模块 打开模块界面,找到自己要调试的程序集,右击加载符号如果 Visual...
dotnet 使用 TypeNameFormatter 库格式化输出反射泛型类型 默认的反射输出带泛型的类型,都会使用反引号的字符串。使用 TypeNameFormatter 库可以输出贴近代码的输出默认的类型的输出是和代码写的方法不相同,如获取 List<int> 类型的输出Console.WriteLine(typeof(List<int>));// 大概输出是 List`1[System.Int32]而我期望输出的是 List<i...
dotnet 读 WPF 源代码笔记 为什么设置了SplashScreen会让Application.Current.Activated事件不触发 在 WPF 应用中,可以非常方便将一张图片设置为 SplashScreen 启动界面欢迎图,但是如果有设置了启动界面欢迎界面,那么 Application.Current.Activated 事件就不会被触发。本文通过 WPF 框架开源的代码告诉大家这个原因这是在 GitHub 上,一个小伙伴问的问题,详细请看 After adding a splashscreen Applicatio...
WPF 通过 Switch.MS.Internal.EnableWeakEventMemoryImprovements 开关开启弱事件内存优化 默认的 WPF 为了保持行为兼容,没有开启弱事件的内存优化。可以在 WPF 中指定 Switch.MS.Internal.EnableWeakEventMemoryImprovements 和 Switch.MS.Internal.EnableCleanupSchedulingImprovements 开关来让 WPF 运行在 .NET Framework 4.8 或 .NET Core 3.0 ...
搭建一个自动化分析 DUMP 平台 本文来告诉大家如何一步步搭建一个 DUMP 分析平台,核心是用来分析桌面端的应用软件,如 WPF 软件的 DUMP 文件。在开始之前需要说明的是,如果桌面端软件使用纯 WPF 实现,中途没有调用不安全的 C++ 库,那么 DUMP 平台几乎无用,原因是 WPF 是 .NET 应用,而 .NET 是安全的,除非是系统环境问题,否则依靠捕获异常所拿到的信息就完全超过了 DUMP 能获取的信息。因此本文...
WPF 基础 2D 图形学知识 判断点是否在线段上 在知道一个使用两个点表示的线段,和另一个点,求另一个点是否在线段上本文算法属于通用的算法,可以在 WPF 和 UWP 和 Xamarin 等上运行,基本上所有的 .NET 平台都能执行如下图,如果点在线段上,那么修改线段颜色假定有线段的定义如下 public record Line { public Point APoint { get; init;...
WPF 设置 ShowInTaskbar 对窗口最小化的影响 在 WPF 中,如果设置了 ShowInTaskbar 为 False 那么窗口将不会在任务栏显示。此时如果设置窗口最小化,那么窗口将会收起来作为没有任务栏时的显示方法如下面代码<Window x:Class="BekairlilearDujalgereno.MainWindow" xmlns="http://schemas.microsof...
WPF 触摸失效 试试重启触摸 在使用一些诡异的系统以及诡异的触摸框的时候,也许会出现 WPF 程序触摸失效,失效的本质原因是 Win32 层应用触摸失效。也许出现的问题是某个窗口设置 TopMost 然后插拔一些触摸设备等,这些行为,如果触摸设备太过诡异,也许就会让 Win32 窗口触摸失效。刚好 WPF 也是一个 Win32 窗口,此时的 WPF 也会触摸失效这个方法因为过于强,我建议只有你在尝试过其他方法无法修复之后...
WPF 实现自定义的笔迹橡皮擦 本文来告诉大家使用比较底层的方法来实现 WPF 的笔迹橡皮擦在 WPF 里面,对于笔迹来说,应该放在 Stroke 类里面,而不是作为点的集合存储。在 Stroke 类里面将作为管理笔迹的类提供笔迹的渲染和橡皮擦等功能。咱下面将从 Stroke 类开始,自己定义笔迹橡皮擦。阅读本文,你将了解如何自定义橡皮擦,如自定义橡皮擦的外观样式,了解如何不依赖 InkCanvas 来实现笔迹的擦除原本...
WPF 笔迹触摸点收集工具 本文来安利大家一个工具,可以用来收集笔迹的触摸点,这个工具完全开源在开始之前先看一下工具的界面实现方式其实就在触摸的时候收集触摸点信息,上面的工具有很多功能都没有实现的。笔迹绘制的功能使用 WPF 最简逻辑实现多指顺滑的笔迹书写 博客的方法实现这个工具代码完全开源,可以在 github 或 gitee 下载全部代码更多笔迹相关请看WPF 渲染原理高性能笔迹原理WPF 高性能...
创建CBB心得 本文来和大家分享制作 CBB 公共组件的一些心得在创建 CBB 的时候的两个核心问题是:让开发者开发的开森;让使用方使用的开森。前者就是本文的讨论内容,后者基本都是靠 API 设计让开发者开发得开森,就涉及到开发策略的不同在创建 CBB 的时候我尝试有两个不同的策略,本文将和大家讨论使用这两个不同的策略在开发效率以及 CBB 推动上的不同差别下面先来和大家聊聊这两个不同的策略第一个策...
dotnet tool 自动找到项目里面重复的 NuGet 依赖项 使用新的 SDK 风格的 csproj 的时候,允许 NuGet 包进行依赖传递。意思是如果我 A 项目安装了库 L 那么如果有 B 项目引用 A 项目,那么自动 B 项目也就安装了库 L 而不需要项目 B 再次手动安装。也就是如果此时的 B 项目里面也加上了 L 库的安装,那么这个安装就是多余的。本文安利大家一个工具,可以自动了解有哪些项目的哪些库是多余安装的,通过依赖传递就能安装上,不需要手动安装,可以删除
dotnet OpenXML 让 PathLst 自定义形状转 SVG 路径格式的 Geometry 内容 在 Office 文档里面,可以使用自己定制的自绘制形状,自己绘制的内容将会存放为 pathLst 也就是 List of Shape Paths 内容到文档里面。本文将告诉大家如何将 PathLst 自定义形状转换为标准的 SVG 路径,以支持在 WPF 或 UWP 中的 Path 元素作为 Geometry 显示
WPF 不禁用实时触摸而收到 WM_Touch 触摸消息方法 在 WPF 中,触摸默认通过 RealTimeStylus 实时触摸进来,根据官方文档,这个机制将会和 WM_Touch 触摸消息在同一个 HWND 是互斥的。而在 WPF 中按照机制,在没有禁用实时触摸下是不支持在窗口内收到 WM_Touch 触摸消息。因此想要在不禁用 WPF 实时触摸的情况下,获取 WM_Touch 触摸消息的一个方法是通过 WinForms 窗口来获取在不禁用 WP...
dotnet OpenXML 修复 Office 文档里面的百分比内容包含百分号 我在解析一个 PPT 文档的时候,发现了这个 PPT 文档的背景色的透明度百分比的字符串里面包含了百分号,而不是一个 OpenXml 里面的百分比单位
dotnet core 和 dotnet Framework 启动可执行文件的差别 在 Windows 下,使用 .NET Framework 构建出来的应用,可以只有一个可执行文件,在可执行文件里面包含了 IL 代码。使用 .NET Core 构建出来的应用,将会包含一个 Exe 可执行文件,和对应的 Dll 文件,而 IL 代码将放在 Dll 文件里面。那么使用 .NET Framework 和使用 .NET Core 所输出的 Exe 可执行文件有什么差别,本文将从文件格式以及启动过程两个方面给大家聊聊这两个的不同
dotnet 读 WPF 源代码笔记 Stroke 类可能存在的内存泄露 在 WPF 中,使用 Stroke 类时,可能会出现内存泄露,原因是 DrawingAttributes 的事件被监听没有释放。本文将从源代码的角度告诉大家这个内存泄露问题和如何解决
dotnet C# 将 Byte 二进制数组使用不安全代码快速转换为 int 或结构体数组 我在写一个有趣的 WPF 应用,我会不断收到从硬件发过来的数据,这些数据被使用 Byte[] 数组进行传输。我想要使用最快的方法转换为我的 int 数组或者转换为结构体数组,此时可以使用不安全代码的方式转换
dotnet 5 静态字段和属性的反射获取 没有想象中那么伤性能 在最近在做 WPF 框架开发的时候,看到了在 WPF 的 StaticExtension 里面,有部分逻辑采用了反射的方法去获取静态字段和静态属性。此时我第一个反应就是这部分逻辑的性能有锅,于是尝试了进行加上缓存来优化。但是在使用了 Benchmark 进行性能测试的时候发现了,其实加上了缓存的性能反而更差,也就是说在 dotnet 5 里面的反射获取静态字段和属性的性能没有想象的伤性能
升级到 dotnet core 之后 HandleProcessCorruptedStateExceptions 无法接住异常 这是 dotnet core 的破坏性改动之一,在 dotnet framework 里面,可以使用 HandleProcessCorruptedStateExceptionsAttribute 接住非托管层抛出的异常,如 C++ 异常等。但是这个功能在 dotnet core 下存在行为的变更,从 .NET Core 1.0 开始,损坏进程状态异常无法由托管代码进行处理。 公共语言运行时不会将损坏进程状态异常传递给托管代码
ASP.NET Core 因为 Nginx 配置 Connection 为 Upgrade 导致 Kestrel 返回 400 错误 我今天遇到了一个坑,我的服务器在经过了 Nginx 之后,发送的 POST 请求,如果请求里面有 Body 内容,那么 Kestrel 将会返回 400 错误,同时也不会经过任何的中间件
C# dotnet 编写 curl 的用户名和密码逻辑 在使用 curl 时,可以采用 -u 加上用户名和密码,这个对应在 C# 里面也是两句话的事情。只是在 curl 里面封装好了,我通过工具人协助解决,于是就在这里记录一下
dotnet 自动迁移 VS 2017 以前的 csproj 转为 dotnet core 的 SDK Style 风格工具 本文来安利大家一个特别好用的工具,可以自动将 VisualStudio 2017 以前版本创建的 Franken-proj 格式 的 csproj 项目文件转换为 dotnet core 的 SDK Style 风格的csproj 项目文件的工具
WPF 框架开发 更改 API 之后让 CI 重新创建 API 兼容检查基准 本文是记录在开发 WPF 框架遇到的问题。在 WPF 框架里面,限制了 API 的变更,所有关于 API 的变动都会触发 API 兼容检查。只有在明确此 API 变更是合理的之后,才能被接受更改。而此兼容判断将会让一些本地构建失败,本文将告诉大家如何使用官方的方法重新创建 API 基准,让本地构建通过
WPF 框架开发 加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员 在 WPF 框架开发中,其实很少有开发者有足够的勇气去更改现有的框架逻辑,因为 WPF 的功能十分庞大,很难测试全。更多的开发都是加功能以及开放已有功能。整个 WPF 框架的大体设计是十分好的,可以在框架里面遵循对修改关闭的原则,定制化更多的是做注入,调用 internal 权限成员本文告诉大家如何给 WPF 框架加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员如果我不新加入一个程序集,而是在原有的程序集开发,加上新功能,是否可行
WPF 框架开发 WPF 的构建在哪使用到 Perl 工具 在构建 WPF 开源仓库的时候,需要先搭建 Perl 环境,此时大家是否想了解在 WPF 构建的哪里用到 Perl 工具在完全开源的 WPF 仓库里面,其实可以看到很多 Perl 的影子,大部分都是用来做构建的脚本,小部分是在做我也看不懂的逻辑做构建脚本的包括了生成一些代码,如 GenerateAvTraceMessages 这个构建步骤,代码定义如下<Project>...
C# 从零开始写 SharpDx 应用 禁止 Alt + Enter 进入全屏 有小伙伴给我报了一个坑,那就是使用我的博客写的方法,在按下 ALT+ENTER 键时,将会让屏幕黑屏。其实原因就是默认的 DX 关联了 ALT+ENTER 快捷键,进入了全屏。本文来告诉大家如何解决这里使用 Alt + Enter 键进入全屏,其实进入的是独占的全屏,和我上次告诉大家的使用以下几篇博客的方法不同C# 纯控制台创建一个全屏窗口WPF 全屏透明窗口但是和 Sharp...
C# 从零开始写 SharpDx 应用 从 D3DDevice 获取 DXGIDevice 方法 本文将告诉大家在拿到了 D3D11 的 Device 也就是 D3DDevice 之后,如何去获取 DXGI.Device 以及 DXGI.Factory 的方法本文是 SharpDX 系列博客,更多博客请点击SharpDX 系列在 C# 从零开始写 SharpDx 应用 初始化dx修改颜色 这篇博客完成了基础的初始化而接下来如何根据之前的代码,也就是如何根据上一篇博客创建的 D3D...
C# 从零开始写 SharpDx 应用 聊聊功能等级 本文将和大家聊聊 DirectX 里面的功能等级在 SharpDx 的使用方法本文是 SharpDX 系列博客,更多博客请点击SharpDX 系列在C# 控制台创建 Sharpdx 窗口已经创建了一个窗口,现在需要在这个窗口初始化。因为是从零开始写,所以需要非常多细节,我觉得一篇文章是很难全部告诉大家,所以分为了系列的文章。从零开始写有利于大家了解一个渲染框架是如何做出来,并且从底层优...
dotnet OpenXML 解析 WPS 不符合压缩文档规范的文档 我遇到了有老师给我反馈说用我的小工具去辅助编辑课件的时候,遇到了他使用 WPS 制作的文档打开失败,原因是 WPS 制作的一些文档不符合压缩文档规范。而 Office 的基于 ECMA 376 的文档,都是使用标准的 ZIP 压缩规范的文档,因此对于这些不符合压缩文档规范的文件,将会解析失败如果使用了不符合压缩规范的文件,那么在使用 OpenXML SDK 读取的时候,将会在解压缩的时候炸掉...
dotnet 读 WPF 源代码笔记 使用 Win32 方法修改窗口的坐标和大小对窗口依赖属性的影响... 咱可以使用 Win32 的 SetWindowPos 修改窗口的坐标和大小,此时 WPF 的窗口的 Left 和 Top 和 Width 和 Height 依赖属性也会受到影响,本文将会告诉大家在啥时候会同步更改 WPF 依赖属性的值,而什么时候不会本文将会用到很多 Win32 方法,在 dotnet 基金会开源了对 win32 等的调用的封装库,请看 https://github.com...
Roslyn 判断当前使用 dotnet core 编译器进行编译 在写 msbuild 预编译或编译调度逻辑时,如何知道当前执行的编译器使用的是上古版本的 msbuild 还是用了 dotnet core 内核的 Roslyn 编译器?本文解决的问题是我期望在 Windows 系统使用 .NET Framework 版本的工具,而在非 Windows 系统上,使用 dotnet core 版本的工具。原因是 .NET Framework 在开发者设备上都会有,用...
dotnet OpenXML 修复 Office 文档里面包含格式不正确的 Uri 而无法解析 在使用 OpenXML 解析 Office 文档,无论是 PPT 还是 Word 还是 Excel 文档,都会使用标准方式解析。而此时的文档如果包含了错误的 Url 格式,例如不正确的邮件名的时候,将会在解析的时候出错。本文告诉大家如何修复这个问题尽管在 Office 2016 等版本,是可以在用户端制作出格式不正确的 Url 文档,如下图所示的内容此时在执行解析的时候,将会提示如下代...
WPF 制作支持点击穿透的高性能的透明背景异形窗口 默认的 WPF 的支持点击穿透的透明背景窗口,是通过 AllowsTransparency 实现的,但是此方法的性能比较低。本文来告诉大家一个高性能的方法,通过此方法制作出来的 WPF 窗口可以获取很高的性能,设置透明和设置窗口不透明之间几乎没有性能差别本文的方法由 少珺 小伙伴提供,我只是代为整理博客。本文的方法是基于 WPF 制作高性能的透明背景异形窗口(使用 WindowChrome ...
win10 uwp 相机的分辨率设置方法 本文来告诉大家如何在 UWP 中修改相机的分辨率设置以及如何使用相机的功能在 UWP 中可以使用 WinRT 提供的 Win10 特有的 API 用来捕获摄像机的内容,支持很多格式的硬件解码,性能会比 Win32 好特别多。我使用了 UWP 版本的和 WPF 基于 DirectShow 的版本进行性能对比发现在使用 WPF 的版本,在我的设备上,大概 CPU 能到百分之十,而完全没有用到 ...
dotnet 集成测试 SmartSql 存在静态量导致多个主机启动提示 Alias 已存在 在集成测试中,我采用单个进程开启多个主机,可以理解为一个用例开启一次主机。但是在我使用到 SmartSql 的功能时,我发现在一个主机关闭之后,再开启下一个主机,会因为使用了相同的别名而提示 SmartSql.Alias:[SmartSql] already exist 错误。本文告诉大家如何解决此问题默认的 dotnet 应用在主机销毁的时候,都会销毁自己的资源。而 SmartSql 没有...
dotnet 读 WPF 源代码笔记 SafeMILHandleMemoryPressure 的作用 本文来告诉大家在 WPF 里面的 SafeMILHandleMemoryPressure 类的作用。这是一个 internal 不开放的类,是在 WPF 中和 Dx 等模块调用使用的,用途就是辅助 GC 统计当前内存情况,用来在内存不够的时候触发回收这个类放在 src\Microsoft.DotNet.Wpf\src\PresentationCore\System\Windows\Media...
WPF 最简方法使用自己定制的 WPF 框架 本文提供了一个最简的方法,可以用到整个 WPF 框架里面所有 internal 内部权限的成员的方法。这是一个我自己定制的 WPF 框架,可以在此基础上构建属于自己的定制化的 WPF 框架本文提供的方法适用于 .NET 5 和 x86 下,如果需要其他版本,请自行构建和使用,关于如何自行构建和定制化,请看 手把手教你构建 WPF 框架的私有版本现在的 WPF 属于 dotnet 基金会组织...
WPF 框架开发 加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员 在 WPF 框架开发中,其实很少有开发者有足够的勇气去更改现有的框架逻辑,因为 WPF 的功能十分庞大,很难测试全。更多的开发都是加功能以及开放已有功能。整个 WPF 框架的大体设计是十分好的,可以在框架里面遵循对修改关闭的原则,定制化更多的是做注入,调用 internal 权限成员 本文告诉大家如何给 WPF 框架加入 InternalsVisibleToAttribute 特性让其他程序集可以访问 internal 权限成员
dotnet C# 链表和字典的性能对比 本文来告诉大家我实际使用基准测试的在 .NET Core 3.1 的链表 LinkedList 和 Dictionary 字典的在元素增删的性能对比从算法分析上,其实字典和链表在时间上的性能是差不多的,甚至可以认为字典的速度会比链表更高。但是从空间上,如果一边增加元素一边删除元素那还是链表省空间。同时在字典空间满了之后,修改字典容量会比链表使用更多的时间以下是我用不够严谨的基准性能测试的数...
WPF 滑动修改音量控件 本文来分享一个简单的控件,滑动的时候显示音量控制条先来一张效果图这是一个特别简单的控件,代码放在github欢迎小伙伴访问我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎...
dotnet 读 WPF 源代码笔记 AppDomainShutdownMonitor 的设计 本文是我在读 WPF 源代码做的笔记。在 WPF 中的 AppDomainShutdownMonitor 类是一个不开放的类,这个类当前只是给 D3DImage 类使用。在 AppDomainShutdownMonitor 提供了在应用的进程或程序域关闭的时候,进行一次通知,当前是用来清理 D3DImage 类的资源在 WPF 中的 D3DImage 类是一个充满黑科技的类,这个类因为黑科...
dotnet 读 WPF 源代码笔记 启动欢迎界面 SplashScreen 的原理 本文是我在读 WPF 源代码做的笔记。在 WPF 中的启动界面,为了能让 WPF 的启动界面显示足够快,需要在应用的 WPF 主机还没有启动完成之前就显示出启动图,此时的启动图需要自己解析图片同时也需要自己创建显示窗口从 WPF 的 src\Microsoft.DotNet.Wpf\src\WindowsBase\System\Windows\SplashScreen.cs 文件可以看到 ...
dotnet 读 WPF 源代码笔记 WIC 多媒体图片处理通过 WindowsCodecs.dll 实现功能 本文是我在读 WPF 源代码做的笔记在 WPF 中,作为一个现代化的 UI 框架,自然有很多多媒体相关的事情需要处理,在 WPF 中有特别的一层是 WIC 层,这一层将包揽了大部分的多媒体图片的处理。如咱熟悉的 BitmapEncoder 类,里面就有大量调用到 WIC 的逻辑那么在 WPF 中说的 WIC 层是什么?通过 官方文档 可以了解到 WIC 就是 Windows Imagin...
dotnet 读 WPF 源代码笔记 wpfgfx_cor3.dll 是什么文件 本文是我在读 WPF 源代码做的笔记通过 WPF 的架构文档可以了解到在 WPF 里面的架构如下图这里有一层很重要的一层是 MilCore 层,这一层将会沟通 DirectX 和 托管层,而这一层在用户端的逻辑就放在 wpfgfx_cor3.dll 文件里面这个文件的命名定义可以从 src\Microsoft.DotNet.Wpf\src\Shared\RefAssemblyAttr...
dotnet 强签名下使用 InternalsVisibleToAttribute 给程序集加上友元 在 dotnet 里面,可以使用 InternalsVisibleToAttribute 特性,给程序集加上友元程序集,这样能让友元程序集访问到 internal 的程序。也就是说如果我有 A 和 B 两个程序集,我设置了 B 作为 A 的友元程序集 那么此时 B 程序集就能访问 A 程序集里面所有的 internal 成员。默认的友元设置只需要通过 InternalsVisibleToAttri...
dotnet OpenXML 解析 WPS 不规范的 PPT 文件的 cNvPr 重复 id 问题 在收到了反馈说有一份课件,打开解析就发现替换的元素不对,原因是这个课件里面的 Slide Master 里面存在一个元素的 id 和某个页面的元素 id 是相同的,这不符合 ECMA 376 的规范。通过读取文档的内容,发现这是 WPS 制作出来的 PPT 文件。本文做一个存档,用来告诉大家有这个坑在 Office 2016 和 Office 2019 的行为判断请看以下两篇博客dotne...
WPF 按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响 在 WPF 里面,默认标题栏的交互相对复杂,如按钮没有设置 WindowChrome.IsHitTestVisibleInChrome 属性为 True 那按钮是拿不到点击事件的。本文来告诉大家按钮 Button 的 IsEnabled 属性对 WindowChrome 的 IsHitTestVisibleInChrome 的影响在 WPF 中的默认交互是点击标题栏的时候,如果是双击标题栏,...
dotnet 部署 GitHub 的 Action Runner 制作自托管运行器 本文告诉大家如何在自己的 CI 服务器上部署一个私有的 GitHub Action Runner 用来执行 GitHub 上的仓库的构建安装为了作为一个 dotnet 的 GitHub Action Runner 的服务器,首先需要在自己的 CI 服务器上安装足够的负载。我下载了 VS 安装了所有能装的功能而 GitHub 的 Action Runner 运行器需要从 GitHub 仓库...
dotnet 5 破坏性改动 WPF 和 WinForms 的 OutputType 输出类型重定向为 WinExe 类型 官方团队为了防逗比,默认将 OutputType 输出类型重定向为 WinExe 类型,这样能解决很多新手遇到的 WPF 项目显示出黑框控制台界面问题。而对于一些老司机来说,这个特点反而有点迷,特别是在尝试打开控制台调试的时候在开始之前,先复习一下 OutputType 这个属性的作用,这个属性告诉了 SDK 程序集输出的文件是什么。可以选的值是 Library 类库和 Exe 控制台程序以...
dotnet 如何更改应用在任务管理器显示的进程名 AssemblyTitle 的值 我有一个应用,我期望他在任务管理器里面显示为 Doubi 这样大家就知道这是一个逗比进程。但是我更改了程序集名,也就是 exe 文件名都没有什么用,因为在任务管理器里面通过 AssemblyTitle 属性决定显示的进程名。本文来告诉大家如何更改 AssemblyTitle 的值在旧版本的 Franken-proj 格式的 csproj 格式里面,在项目都有一个 Properties\Ass...
dotnet core 应用是如何跑起来的 通过自己写一个 dotnet host 理解运行过程 在上一篇博客是使用官方提供的 AppHost 跑起来整个 dotnet 程序。本文告诉大家在 dotnet 程序运行到托管代码之前,所需要的 Native 部分的逻辑。包括如何寻找 dotnet 运行时,如何加载运行时和框架然后跑起来业务端的 dll 文件的逻辑在上一篇博客告诉大家在 dotnet 的 AppHost 是如何做的,详细请看 dotnet core 应用是如何跑起来的 通过Ap...
dotnet 使用 FileAccess 与 OpenOrCreate 对文件访问权限的影响 本文告诉大家在 dotnet 里面,客户端应用,如 WPF 应用对当前应用程序运行用户无写权限的文件进行访问的时候,调用 File.Open 方法的各个参数的影响在 File.Open 方法里面其实就是对 FileStream 创建的封装,在 FileStream 的构造函数有大量的参数,而对文件权限有影响的是 FileMode 和 FileAccess 和 FileShare 三个通过 ...
Xamarin iOS 部署应用提示 iOS code signing key 失败 在部署 iOS 应用的时候,如果是拉别人的代码,因为被使用了别人的签名,就会提示 Error: iOS code signing key ‘iPhone Developer: lindexi@icloud.com (F56JH45N57)’ not found in keychain. 部署失败。解决方法是替换为自己的账号原因就是在 csproj 上的 CodesignProvision 属性设置的是别人的签名,可以通过替换为自己的账号解决在 Xamarin 从零开始部署 iOS 上的 Walte
dotnet core 应用是如何跑起来的 通过AppHost理解运行过程 在 dotnet 的输出路径里面,可以看到有一个有趣的可执行文件,这个可执行文件是如何在框架发布和独立发布的时候,找到 dotnet 程序的运行时的,这个可执行文件里面包含了哪些内容在回答上面的问题之前,请大家尝试打开 C:\Program Files\dotnet\sdk\5.0.100\AppHostTemplate\ 这个文件夹。当然了,请将 dotnet 版本号修改为你本机的版本号...
Mac 升级到 dotnet 5 构建 Xamarin 应用失败 error MSB4186 静态方法调用语法无效 我昨天将 Mac 构建机器也升级到了 dontet 5 最新版。但是在升级之后,所有的 Xamarin 项目都在 Mac 版本的 VisualStudio 构建不通过,提示 error MSB4186: 静态方法调用语法无效。解决方法就是将 VisualStudio 更新到最新版本在升级到 dotnet 5 之后,在 Mac 设备上使用 Mac 版本的 VisualStudio 构建 Xa...
dotnet 编译 Rolsyn 编译器 这是一个套娃,在编译 Rolsyn 编译器之前需要有 Rolsyn 编译器,用 Rolsyn 编译器来编译 Rolsyn 编译器。本文来告诉大家如何构建 Rolsyn 编译器,步骤特别少,很简单整个 Rolsyn 编译器的代码基本都是由 C# 和 VB 构成的,所有源代码都在 GitHub 上完全开源请看: https://github.com/dotnet/roslyn除了 Rolsy...
dotnet 如何在 dotnet test 单元测试控制台里输出日志内容 我在协助小伙伴调试一个只有在 GitHub 的 Action 自动测试时才会炸的问题,而我发现默认的控制台输出是不会在 GitHub 的 Action 显示的,换句话说,在使用 dotnet test 时,代码里面使用的控制台输出不会进行输出解决方法很简单,只需要在控制台输出的部分逻辑修改为 Console.WriteLine 而不是 Debug.WriteLine 方法然后在 dotn...
WPF 多指触摸拖拽窗口 拖动修改窗口坐标 在 WPF 中,如果是鼠标点击拖动窗口坐标,可以调用 Window 的 DragMove 方法,但是如果是触摸,就需要自己调用 Win32 的方法实现在 WPF 中,调用 Window 的 DragMove 方法要求鼠标的左键(主键)按下,否则将会抛出如下代码System.InvalidOperationException:“只能在按下主鼠标按钮时调用 DragMove。”或英文版的代...
WPF 源代码 资源字典 ResourceDictionary 设置 Source 属性的逻辑 本文来和大家聊聊在 WPF 里面在给 ResourceDictionary 设置 Source 属性时,在 WPF 框架里面做了哪些逻辑默认添加 Source 时都是指定 WPF 自身的 XAML 资源字典,用途就是指定 XAML 字典作为此控件的资源字典而默认的 XAML 资源字典使用 Page 形式进行构建,构建之后作为二进制的 Baml 文件被打入程序集中作为程序集资源,在 dot...
开源实战 本文记录我参与的开源项目dotnet runtimeAdd logger to cache entry to catch exception by lindexi · Pull Request #37292 · dotnet/runtimeUse Array.Empty in CompositeFileProvider by lindexi · Pull Request #38086...
WPF 设置资源字典多线程安全读写方法 在 WPF 中,使用 ResourceDictionary 本身不会受到创建线程同步影响,意味着可以在任意的线程创建 ResourceDictionary 资源字典,然后在任意线程使用。但是此时的读写需要有时间上的差距,否则将会多线程读写不安全。在 ResourceDictionary 有一个 CanBeAccessedAcrossThreads 属性用来决定在进行读写的时候是否加上锁,但这个属性...
XP 源代码 如何在清空回收站时修改回收站图标 本文来聊聊在 XP 系统里面,是如何在清空回收站的时候修改回收站图标的声明 我没有拿到微软泄露 XP 系统的源代码,以下逻辑都是我瞎说的,微软才不会写出如此逗比的代码在 bitbuck.c 文件里面有 SHUpdateRecycleBinIcon 的实际实现,而这个方法实际上只是调用了 UpdateIcon 方法而已。大概的代码如下STDAPI_(void) SHUpdateRecyc...
asp dotnet core 基于 TestServer 做集成测试 我有一个古老的 dotnet core 3.1 的 asp dotnet core 项目,现在我准备将他升级到 dotnet 5 了。但是我不想和博客园一样翻车,因此我需要做一点集成测试的辅助,尽管依然还是翻车了,但是我要学习博客园伟大的精神,将在这个项目里面所做的所有自动化测试项目的方法写下来在开始从 dotnet core 3.1 升级到 dotnet 5 之前,我先开始准备集成测试。...
WPF 设置元素为 Collapsed 是否会创建此元素 在 WPF 的 XAML 中,如果将某个元素初始的时候设置 Visibility 为 Collapsed 的值,那么意味着这个元素将不会参与布局,就和不存在是一样的。那么这个元素是否会被创建在内存中?是会创建的在 WPF 中,在 XAML 里面写的元素,无论 Visibility 设置为什么,都会在内存中创建这个元素对象测试方法是自己定义一个元素,然后在 XAML 里面写,如下面代码定义...