c#
文章平均质量分 72
lindexi_gd
我是微软Windows应用开发方向的最具价值专家,欢迎访问我博客blog.lindexi.com里面有大量WPF和UWP博客
展开
-
dotnet 教你写一个可以搞炸本机所有 WCF 应用的程序方法
作为团队里面挖掘机出身的我,怎么能不多挖一些坑好将小伙伴们都埋进去呢。本文来告诉大家一个有趣且简单的方法,此方法可以将本机的 WCF 玩坏,不敢说真的搞炸本机所有 WCF 应用,但搞炸大部分基于 WCF 的软件还是没有问题的。阅读本文,你可以不仅可以了解到有这样的逗比方法,更重要的是在你的 WCF 模块炸掉的时候,你知道要甩锅给谁原创 2021-08-24 00:56:46 · 432 阅读 · 0 评论 -
MSIL 静态类在 IL 定义上和非静态类的差别
本文来聊聊 MSIL 的基础知识,给一个 C# 的类标记了 static 之后和标记 static 之前,生成这个类的 IL 代码有什么不同原创 2021-07-29 00:24:11 · 330 阅读 · 0 评论 -
WinDbg 加载 dotnet core 的 sos.dll 辅助调试方法
本文告诉大家如何加载 .NET Core 或 .NET 5 的 sos.dll 文件到 WinDbg 的方法原创 2021-07-29 00:24:11 · 612 阅读 · 0 评论 -
WPF 稳定的全屏化窗口方法
本文来告诉大家在 WPF 中,设置窗口全屏化的一个稳定的设置方法。在设置窗口全屏的时候,经常遇到的问题就是应用程序虽然设置最大化加无边框,但是此方式经常会有任务栏冒出来,或者说窗口没有贴屏幕的边。本文的方法是基于 Win32 的,由 lsj 提供的方法,当前已在 500 多万台设备上稳定运行超过半年时间,只有很少的电脑才偶尔出现任务栏不消失的情况原创 2021-08-13 00:35:38 · 1051 阅读 · 0 评论 -
dotnet 使用 FormatterServices 的 GetUninitializedObject 方法在丢失 DLL 情况下能否执行
在 dotnet 里面,可以使用 FormatterServices 的 GetUninitializedObject 方法可以实现只创建对象,而不调用对象的构造函数方法。而如果在使用此方法时,存在了 DLL 缺失的情况,此时能否让此方法运行通过,创建出空的对象原创 2021-07-24 01:00:01 · 337 阅读 · 0 评论 -
dotnet C# 高性能配置文件读写库 dotnetCampus.Configurations 简介
在应用程序运行的时,需要根据不同的配置执行不同的内容。有很多根据配置而初始化的功能往往是在应用程序启动的时候需要执行。对于很多类型的应用程序,特别是客户端的应用程序,启动的性能特别重要。也因此,在启动过程中需要依赖配置文件的不同配置而启动不同的功能时,就对配置文件的读写和解析性能提出了很高的要求 本文来和大家简单介绍我团队开源的 dotnetCampus.Configurations 高性能配置文件读写库。这个库不仅包含了配置文件的读取解析,还包括了自定义配置文件格式,也就是 COIN 硬币格式的配置文件原创 2021-07-20 00:33:10 · 833 阅读 · 0 评论 -
GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性
假设有一个捣蛋的小伙伴加入了你的团队,这个捣蛋的小伙伴喜欢乱改代码,请问此时的单元测试能否拦住这些逗比行为?如果不能拦住逗比行为,是否代表着单元测试有所欠缺,或者有某些分支逻辑没有考虑到。本文将告诉大家的 Stryker.NET 就属于这样的一个捣蛋的小伙伴,这个工具将会在执行测试的时候乱改你的代码,看看你的单元测试是否能拦住这样的行为。如果在乱改代码之后,单元测试依然是通过的,那证明单元测试没有拦住此行为,说不定就需要改改单元测试了原创 2021-07-20 00:33:10 · 355 阅读 · 0 评论 -
dotnet C# 给结构体字段赋值非线程安全
在 dotnet 运行时中,给引用对象进行赋值替换的时候,是线程安全的。给结构体对象赋值,如果此结构体是某个类的成员字段,那么此赋值不一定是线程安全的。是否线程安全,取决于结构体的大小,取决于此结构体能否在一次原子赋值内完成原创 2021-09-08 00:37:27 · 1493 阅读 · 0 评论 -
dotnet C# 多次对一个对象调用构造函数会发生什么
今天来玩一点变态的,使用反射获取到某个类型的构造函数,接着多次对此类型的某个对象调用构造函数方法。请问此时会发生什么原创 2021-09-08 00:37:27 · 1438 阅读 · 0 评论 -
dotnet OpenXML 读取 PPT 内嵌 ole 格式 Excel 表格的信息
在 Office 中,可以在 PPT 里面插入表格,插入表格有好多不同的方法,对应 OpenXML 文档存储的更多不同的方式。本文来介绍如何读取 PPT 内嵌 ole 格式的 xls+ 表格的方法在 Office 的 PPT 中,插入表格可以对应多个不同的方式:通过 GraphicData 内嵌到 PPTX 页面里面通过嵌入文件方式通过 SmartArt 模拟的表格,本质上就是 S...原创 2021-09-04 00:30:10 · 2487 阅读 · 0 评论 -
WPF 简单判断主线程界面是否卡顿的方法
本文来告诉大家如何使用简单的代码判断当前的软件的 UI 线程或界面是否卡顿在后台线程调用如下代码即可用来判断是否卡顿 private static async Task<bool> CheckDispatcherHangAsync(Dispatcher dispatcher) { var taskCompletionSou...原创 2021-09-04 00:30:10 · 1937 阅读 · 0 评论 -
dotnet 6 数组拷贝性能对比
本文来对比多个不同的方法进行数组拷贝,和测试其性能测试性能必须采用基准(标准)性能测试方法,否则测试结果不可信。在 dotnet 里面,可以采用 BenchmarkDotNet 进行性能测试。详细请看 C# 标准性能测试拷贝某个数组的从某个起始点加上某个长度的数据到另一个数组里面,可选方法有很多,本文仅列举出使用 for 循环拷贝,和使用 Array.Copy 方法和用 Span 方法进...原创 2021-09-02 10:41:31 · 1219 阅读 · 0 评论 -
dotnet C# 根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法
本文来告诉大家如何根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法方法很简单,请看代码 /// <summary> /// 辅助进行椭圆点计算的类 /// </summary> /// 我觉得这个类应该是框架有带,或现成的方法,但是一时间没找到 static class EllipseCoordinateHelper ...原创 2021-08-30 12:20:39 · 1548 阅读 · 0 评论 -
dotnet C# 全局 Windows 鼠标钩子
本文来告诉大家一个简单的方法实现全局的 鼠标钩子实现封装方法十分简单,请看代码 public class MouseHookEventArgs : EventArgs { public bool Handle { get; set; } /// <inheritdoc /> public MouseHookEve...原创 2021-08-30 01:00:43 · 1101 阅读 · 0 评论 -
使用 FastTunnel 做内网穿透远程计算机桌面服务器
FastTunnel是一款高性能跨平台内网穿透工具,使用它可以实现将内网服务暴露到公网供自己或任何人访问。对比市面上的其他内网穿透工具最大优势在于基于 dotnet 编写,提供二次开发扩展能力。本文将来告诉大家,在不做任何编程的情况下,通过 FastTunnel 工具,让我某台内网的 Windows 电脑,开启远程桌面服务,提供外网连入的能力本文的演示需要三台计算机设备,其中一台是服务器,服...原创 2021-07-05 00:30:16 · 1313 阅读 · 0 评论 -
dotnet C# 调用委托的 GetInvocationList 的对象分配
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,在热路径下,也就是频繁调用的模块,如果调用了委托的 GetInvocationList 方法,那么将视委托的大小,每次创建不同大小的新数组对象,而在频繁调用的模块,将会创建大量的对象如以下代码的一个委托,当然对于事件来说也是如此 A...原创 2021-06-29 00:44:31 · 459 阅读 · 0 评论 -
dotnet C# 使用无捕获的委托可以获得编译器缓存减少对象创建
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,通过让委托无捕获来进行性能优化在 .NET 应用中,咱可以通过委托将某个方法传入到某个模块里面,让这个模块在合适的时候,执行传入的方法。如果传入的是实例的方法,那在编译器生成委托时,将会自动加上捕获包,本质上的捕获包是一个对象,也就是每次调用都需要分配对象...原创 2021-06-26 00:32:46 · 327 阅读 · 0 评论 -
dotnet C# 使用 EqualityComparer 提升泛型值类型相等判断性能
本文也叫跟着 Stephen Toub 大佬学性能优化系列,这是我从 Stephen Toub 大佬给 WPF 框架做性能优化学到的知识,通过 EqualityComparer 静态类的相等方法来优化值类型相等判断性能在一些泛型类型里面,需要进行值相等判断,此时默认就是使用 Equals 方法,如下面代码public override bool Contains(T value){ ...原创 2021-06-26 00:32:46 · 1178 阅读 · 0 评论 -
dotnet C# 字典 Dictionary 和 Hashtable 的性能对比
如果没有特别的需求,请使用 Dictionary 而不是 Hashtable 原因是 Dictionary 的性能更好,本文将告诉大家 Stephen Toub 大佬的评测从 2021 的 6 月 23 日,在 WPF 仓库里面,开始看到了性能优化狂魔 Stephen Toub 大佬给 WPF 做的性能优化如在 Use Dictionary instead of Hashtable in ...原创 2021-06-25 00:39:20 · 1211 阅读 · 0 评论 -
dotnet C# 多线程集合的 Linq 获取值同时写入集合将会抛出异常
在集合变更,无论是使用 foreach 遍历还是使用 Linq 语句,即使是 FirstOrDefault 获取第一项,都会失败例如下面代码,在两个线程里面,第一个线程获取使用 FirstOrDefault 方法,第二个线程变更集合内容 static void Main(string[] args) { var list = new L...原创 2021-06-25 00:39:20 · 427 阅读 · 0 评论 -
WPF 下拉框选项做鼠标 Hover 预览效果
本文来告诉大家如何在 WPF 中,在 下拉框 ComboBox 里面,鼠标移动到 ComboBoxItem 上时,自动触发对应的事件,用来预览此选项值。例如我在实现一个颜色下拉框,此时我可以通过点击下拉框显示多个不同的颜色,鼠标移动到某个颜色选项上,可以修改界面,预览此颜色的内容大概的界面如下图,点击右边的颜色下拉框,可以显示多个不同的颜色,而鼠标移动到下拉框的选项上,可以自动让文标的颜色进...原创 2021-06-23 01:07:44 · 893 阅读 · 0 评论 -
dotnet C# 获取一个可用的端口的方法
本文来告诉大家如何可以获取一个可用的端口使用如下代码可以返回一个可用的端口 public static int GetAvailablePort(IPAddress ip) { TcpListener l = new TcpListener(ip, 0); l.Start(); int p...原创 2021-06-21 00:57:25 · 1339 阅读 · 0 评论 -
dotnet C# 如果在构造函数抛出异常 析构函数是否会执行
假设在某个类型的构造函数里面抛出了异常,那么这个对象的析构函数是否会执行如下面代码 private void F1() { try { _ = new Foo(); } catch { ...原创 2021-06-18 00:47:56 · 597 阅读 · 0 评论 -
dotnet C# 只创建对象不调用构造函数方法
有时我期望只是创建出对象,但是不要调用对象的构造方法,可以通过使用 FormatterServices 的 GetUninitializedObject 函数来实现只创建对象不调用构造函数方法这个 FormatterServices.GetUninitializedObject 方法大部分是用在做序列化使用的,然而在很多 IOC 容器,也都使用此方法来创建对象,而通过其他方法拿到构造函数在...原创 2021-06-18 00:47:56 · 661 阅读 · 0 评论 -
WPF 后台代码做 TranslateTransform 的动画
本文告诉大家,在后台代码,对 TranslateTransform 做动画的方法今天小伙伴问我一个问题,说为什么相同的代码,如果设置到按钮上,是可以让按钮的某个属性变更,但是如果设置给 TranslateTransform 的 X 或 Y 就不会有任何值变更在 WPF 中,通过 官方文档 里面的描述,对于 Freezable 类型的对象,如 SolidColorBrush 和 Rotate...原创 2021-06-18 00:47:56 · 971 阅读 · 0 评论 -
dotnet C# 在 finally 抛异常会发生什么
如果我在一个方法的 finally 里面抛出异常,而在 try 里面也抛出,那在上层拿到的是什么如下面代码 private void F1() { try { A(); } catch (Exception e) ...原创 2021-06-18 00:47:56 · 443 阅读 · 0 评论 -
dotnet C# 如果在构造函数抛出异常 是否可以拿到对象赋值的变量
如果使用某个变量去获取某个类型的对象创建,但是在这个类型的构造函数调用时抛出异常,请问此变量是否可以拿到对应的对象如下面代码 private void F1() { Foo foo = null; try { foo = new Foo(); ...原创 2021-06-18 00:47:56 · 336 阅读 · 0 评论 -
dotnet 忽略输出文件夹的正则表达式
本文告诉大家在 dotnet 里面忽略 obj 和 x86 等输出文件夹的正则表达式内容正则表达式如下 private static readonly Regex IgnoreIdentifierRegex = new Regex(@"^([Bb]in|[Oo]bj|[Dd]ebug|[Rr]elease|[Xx]86|[Xx]64|net[\.\w]*\d+)$&...原创 2021-06-09 00:49:35 · 400 阅读 · 0 评论 -
dotnet OpenXML SDK 形状几何 Geometry 的计算公式含义
本文来告诉大家,在 OpenXML 里面的 Geometry 的如 gdLst 和 ahLst 和 pathLst 等里面参数的公式的参数含义这部分内容放在 ECMA-376 的 20.1.10.55 章文档里面,本文只是将文档里面的内容翻译一下在使用 OpenXML 读取形状时,会看到有些形状的定义内容如下 <avLst xmlns="http://schemas....原创 2021-06-04 01:02:12 · 621 阅读 · 0 评论 -
通过 COM 读取 Office PPT 文件提示 COMException 错误码 0x80004005 可能原因
使用 COM 的方式可以调用本机的 Office 组件进行 PPT 以及 Word 和 Excel 等文件的读写,在打开文件的时候,如果提示 System.Runtime.InteropServices.COMException (0x80004005) 就意味着这是一个通用的错误,没有具体的原因调用 COM 组件,提示 System.Runtime.InteropServices.COME...原创 2021-05-11 00:42:56 · 2465 阅读 · 0 评论 -
dotnet 文档应用的撤销重做设计
文档应用是指如 Word 或 PPT 等的提供给用户进行内容创作的工具,而撤销重做其实也被称为撤销恢复功能。本文来告诉大家撤销重做这个模块的设计路线,从简单的复杂大部分的应用软件都可以采用敏捷开发,不断进行迭代。应用的每个小功能都在不断迭代中,成为模块或者某个团队产品。撤销重做功能也是可以从一个小功能,迭代成为一个文档的核心模块在软件开始开发的时候,很少会有人能了解这个软件产品的未来,如果...原创 2021-04-19 00:29:52 · 410 阅读 · 0 评论 -
dotnet 使用 ShowMeTheXAML 显示 WPF 的 XAML 控件内容
本文来告诉大家一个好用的控件库,这个控件库可以方便用在自己编写示例项目中使用。使用 ShowMeTheXAML 控件库可以将某段 XAML 内容作为字符串文本内容显示出来,方便让其他开发者看到界面以及对应的内容此控件库 ShowMeTheXAML 不仅支持 WPF 同时也支持 UNO 项目使用此控件的界面逻辑大概如下 <showMeTheXaml:XamlDisplay Uniq...原创 2021-04-01 00:55:09 · 1816 阅读 · 0 评论 -
dotnet 读 WPF 源代码笔记 默认的 Main 函数是在哪创建的
在使用默认的 WPF 项目开发的时候,咱是不需要自己编写 Main 函数的,在 WPF 中的 Main 函数是存放在 App.g.cs 里面,看起来这个 Main 函数是生成的函数,本文将介绍在 WPF 框架中是如何创建这个入口函数阅读本文你将了解 WPF 框架中,默认在 App.g.cs 生成入口 Main 函数的详细过程。阅读本文之前,你需要了解一些编译过程的知识以及代码生成的知识默...原创 2021-03-30 00:32:36 · 524 阅读 · 0 评论 -
dotnet 使用 TypeNameFormatter 库格式化输出反射泛型类型
默认的反射输出带泛型的类型,都会使用反引号的字符串。使用 TypeNameFormatter 库可以输出贴近代码的输出默认的类型的输出是和代码写的方法不相同,如获取 List<int> 类型的输出Console.WriteLine(typeof(List<int>));// 大概输出是 List`1[System.Int32]而我期望输出的是 List<i...原创 2021-03-26 00:41:14 · 447 阅读 · 0 评论 -
dotnet 读 WPF 源代码笔记 为什么设置了SplashScreen会让Application.Current.Activated事件不触发
在 WPF 应用中,可以非常方便将一张图片设置为 SplashScreen 启动界面欢迎图,但是如果有设置了启动界面欢迎界面,那么 Application.Current.Activated 事件就不会被触发。本文通过 WPF 框架开源的代码告诉大家这个原因这是在 GitHub 上,一个小伙伴问的问题,详细请看 After adding a splashscreen Applicatio...原创 2021-03-25 02:04:15 · 456 阅读 · 0 评论 -
WPF 通过 Switch.MS.Internal.EnableWeakEventMemoryImprovements 开关开启弱事件内存优化
默认的 WPF 为了保持行为兼容,没有开启弱事件的内存优化。可以在 WPF 中指定 Switch.MS.Internal.EnableWeakEventMemoryImprovements 和 Switch.MS.Internal.EnableCleanupSchedulingImprovements 开关来让 WPF 运行在 .NET Framework 4.8 或 .NET Core 3.0 ...原创 2021-03-24 00:30:25 · 470 阅读 · 0 评论 -
C# dotnet Thread.GetCurrentProcessorId 和 CurrentProcess.Id 的区别
使用 Thread.GetCurrentProcessorId 可以获取当前线程处理器的 Id 是哪个,而通过 Process.GetCurrentProcess().Id 可以获取当前进程的 Id 号,这两个的差别从上面描述就能看出更进一步的 Thread.GetCurrentProcessorId() 方法将会缓存处理器的 Id 因此前后两次线程如果处理器切换,此时拿到的值是不对的。在...原创 2020-06-30 01:42:29 · 750 阅读 · 1 评论 -
WPF 基础 2D 图形学知识 判断点是否在线段上
在知道一个使用两个点表示的线段,和另一个点,求另一个点是否在线段上本文算法属于通用的算法,可以在 WPF 和 UWP 和 Xamarin 等上运行,基本上所有的 .NET 平台都能执行如下图,如果点在线段上,那么修改线段颜色假定有线段的定义如下 public record Line { public Point APoint { get; init;...原创 2021-03-19 00:50:54 · 570 阅读 · 0 评论 -
WPF 设置 ShowInTaskbar 对窗口最小化的影响
在 WPF 中,如果设置了 ShowInTaskbar 为 False 那么窗口将不会在任务栏显示。此时如果设置窗口最小化,那么窗口将会收起来作为没有任务栏时的显示方法如下面代码<Window x:Class="BekairlilearDujalgereno.MainWindow" xmlns="http://schemas.microsof...原创 2021-03-19 00:50:54 · 745 阅读 · 0 评论 -
WPF 实现自定义的笔迹橡皮擦
本文来告诉大家使用比较底层的方法来实现 WPF 的笔迹橡皮擦在 WPF 里面,对于笔迹来说,应该放在 Stroke 类里面,而不是作为点的集合存储。在 Stroke 类里面将作为管理笔迹的类提供笔迹的渲染和橡皮擦等功能。咱下面将从 Stroke 类开始,自己定义笔迹橡皮擦。阅读本文,你将了解如何自定义橡皮擦,如自定义橡皮擦的外观样式,了解如何不依赖 InkCanvas 来实现笔迹的擦除原本...原创 2021-03-15 00:43:55 · 1297 阅读 · 2 评论