委托的单例模式
在项目中我们经常会使用到委托委托是多播的,如果控制不好反复注册就会多次触发,可以使用委托的单例模式去注册,这样可以避免多次触发问题。 下面是几种委托实例代码: 带参数委托管理: summary 带参数的委托管理 summary public class ActionManagerT { summary 用于存放ViewModel之间的委托 summary public static Dictionarystring ActionT _actions = new Dictionarystring
Visual Studio 2022中粘贴代码会自动变转义字符
装了Visual Studio 2022之后,一直没有正式的项目在跑。最近有新项目,决定试试. 6的新特性。在添加集合时,粘贴”)补充字符串时,发现VS居然自动帮我转了转义字符,比如原文是:var fields = new Liststring() fields.Add("zip我想补充成:fields.Add("zip")结果却变成了:fields.Add("zip\")这明显是画蛇添足,但在原来的Visual Studio 2019不会这样。 下拉“撤销”菜单,发现有个操作叫“Fixing strin
WinForm中UI假死的解决方法
https:www.codenong.comcs106719464 WinFm中的UI假死其实是个老生常谈的问题了,但最近还是很多人问我该如何解决,所以今天就来说明一下如何解决UI假死的问题。实验程序界面如下图所示:方法一:async + await + Task 首先看下面一段代码:1234567891011121314151617181920212223242526272829303132333435using System using System.Collections.Generic us
开源.NetCore通用工具库Xmtool使用连载
【Github源码】《上一篇》 介绍了Xmtool工具库中的图形验证码类库,今天我们继续为大家介绍其中的扩展动态对象类库。扩展动态对象是整个工具库中最重要的一个设计。在软件开发过程中,我们经常需要定义各种各样的数据对象;例如:用于参数传递的数据实体类、用于接口返回结果的Json对象等等。 人员数据实体定义 public class Person {public string Name { get set } = nullpublic int Age { get set } = 0 }当我们遇到的场景越多
【算法】数学之旅,根据素数特征寻找底数
当下午六点的钟声敲响,小悦如常地结束了一天的工作。她坐在工位上,脑海中不禁回想起自己学习数学的过程。那些数字、公式以及那些漫长夜晚的努力,都像是一段迷人的旋律,让她无法忘怀。当她沉浸在回忆中时,那迷人的微笑映入了旁人的眼帘,而这一幕恰好被一位同事捕捉到。 “你在笑什么呢?”同事好奇地问道。 “哦,没什么。”小悦笑着回答,“只是想起了一些有趣的数学问题。” 由于等电梯的人太多,小悦便开始回想那些神奇的数字,它们就像是被隐藏在数学世界中的宝藏,让当时年少的她充满了好奇与探索的欲望。她一一列举出那些数字:89、
C# BeginInvoke实现异步编程
C# BeginInvoke实现异步编程CSDN博客 https:blog.csdn.Nire_Yeyuarticledetails133203267 C# BeginInvoke实现异步编程BeginInvoke实现异步编程的三种模式: 1.等待模式在发起了异步方法以及做了一些其他处理之后,原始线程就中断并且等异步方法完成之后再继续;eg: using Systemusing System.Collections.Genericusing System.ComponentModelusing Sys
模拟.NET应用场景,综合应用反编译、第三方库调试、拦截、一库多版本兼容方案
免责声明使用者本人对于传播和利用本公众号提供的信息所造成的任何直接或间接的后果和损失负全部责任。公众号及作者对于这些后果不承担任何责任。如果造成后果,请自行承担责任。谢谢!大家好,我是沙漠尽头的狼。 本文首发于Dot9,结合前面两篇(如何在没有第三方.库源码的情况下调试第三库代码?和拦截、篡改、伪造.类库中不限于public的类和方法),本文将设计一个案例,手把手地带大家应用这两篇文章中涉及的技能,并介绍一种支持多个版本的库的兼容性解决方案(涉及第三方库的反编译和强签名)。 本文的目录如下:前言 案例设计
Abp vNext 依赖注入
文章目录 介绍 ABP的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的。所以我们采用dot自带的注入方式也是支持的。由于ABP是一个模块化框架因此每个模块都定义它自己的服务并在它自己的单独模块类中通过依赖注入进行注册.例:public class BlogModule : AbpModule {public override void ConfigureServices(ServiceConfig
【23种设计模式】外观模式(十)
前言 外观模式,英文名称是:Facade Pattern。我们先从名字上来理解一下“外观模式”。我看到了“外观”这个词语,就想到了“外表”这个词语,两者有着很相近的意思。就拿谈恋爱来说,“外表”很重要,如果第一眼看着很舒服、有眼缘,那就有交往下去的可能。如果长的“三寸钉、枯树皮”,估计就够呛了。在这方面,“外观”和“外表”有着相同的作用。在软件系统中,要完成一个功能,需要很多接口调用,不仅增加了开发难度,也增加了调试成本和维护的复杂度。不如我们把这些接口再封装一次,给一个很好的“外观”,让使用者使用更方便
记一次 .NET 某拍摄监控软件 卡死分析
一:背景 1. 讲故事 今天本来想写一篇 非托管泄露 的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软件卡死了,让我帮忙分析下为什么会卡死,听到这种软件,让我不禁想起了前些天 在程序员桌子上安装监控 的新闻,参考如下:我在想我这不是尼玛作恶吗... 😂😂😂 和朋友确认了下还好不是干这个事的。 二:WinDbg 分析 1. 为什么会卡死 因为这种监控软件是窗体程序,所以它的卡死理应看主线程的调用栈即可 在windbg中有一个
Abp vNext 模块加载机制
文章目录 生命周期PreConfigureServices 添加依赖注入或者其它配置之前 ConfigureServices 添加依赖注入或者其它配置 PostConfigureServices 添加依赖注入或者其它配置之后 OnPreApplicationInitialization 初始化所有模块之前 OnApplicationInitialization 初始化所有模块 OnPostApplicationInitialization 初始化所有模块之后 OnApplicationShutdown
WebApi中添加Jwt鉴权
前言 JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。一个 JWT 实际上就是一个字符串,它由三部分组成,头部、载荷与签名。前两部分需要经过 Base64 编码,后一部分通过前两部分 Base64 编码后再加密而成。针对前后端分离的项目,大多是通过 token 进行身份认证来进行交互,今天将介绍一种简单的创建 和验证token 的方式 。项目介绍 项目框架:. Ce 3.1 项目依赖:Swashbuckle.AspCeJWT项
理解并掌握C#的Channel:从使用案例到源码解读(一)
引言 在C#的并发编程中,Channel是一种非常强大的数据结构,用于在生产者和消费者之间进行通信。本文将首先通过一个实际的使用案例,介绍如何在C#中使用Channel,然后深入到Channel的源码中,解析其内部的实现机制。 使用案例一:文件遍历和过滤 在我们的使用案例中,我们需要遍历一个文件夹及其所有子文件夹,并过滤出具有特定扩展名的文件。在此,我们使用了C#的Channel来实现这个任务。 首先,我们创建了一个名为EnumerateFilesRecursively的方法,这个方法接受一个文件夹路径作
记一次 .NET某新能源MES系统 非托管泄露
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序有内存泄露,跟着我的错题集也没找出是什么原因,刚好手头上有一个 7G+ 的 dump,让我帮忙看下是怎么回事,既然找到我了那就给他看看吧,不过他的微信头像有点像 二道贩子,不管到我这里是不是 三道,该分析的还得要分析呀。😄😄😄 二:WinDbg 分析 1. 到底是哪里的泄露 这个非常简单,对用户态内存段做一个分组处理就明白了,可以用 windbg 的 !address summary 观察便知。0:000 !address summary
我封装的一个REPR库 Biwen.QuickApi
Biwen.QuickApi 项目介绍 [QuickApi("hellowld")] public class MyApi : BaseQuickApiReqRsp{}提供一种简单集成的Minimal Web Api交互模块 遵循了 REPR 设计 (RequestEndpointResponse) 开箱即用的Api路由 和 权限Bindvalidat体验 该库是 WebApiMinimal Api的补充,性能≈MinimalApi遥遥领先于MVC和WebApi,但是提供了最简单的的使用体验 write
C# 操作INI文件
C#读写INI文件.程序中,可以作为配置文件使用的格式又很多,INI文件在某些场景应用较为广泛,如串口参数、一些工作站本地参数等等,INI文件主要用途为读取指定节点的配置内容,以及修改指定节点。一下文章主要描述在程序对INI文件的操作。INI文件介绍 INI文件ini文件本质上就是一个扩展名为ini的文本文档,也可以当成记事本来操作。 与文本文档的区别在于,ini文件有自己的格式。INI文件结构INI文件由段落(section)、键(key)、值(value)组成 section为段落名称,也可以理解为一
async/await 与console(C#)
问题: 上一篇asyncawait 致WPF卡死问题(https:www.cnblogs.comstephen2023p17725159.html),介绍主线程阻塞,asyncawait导致卡死问题,同样的代码在console下却并不会出现卡死。static Stopwatch sw = new Stopwatch()static void log(string message){Console.WriteLine($"{sw.ElapsedMilliseconds}:{message} by Threa
async/await 致WPF卡死问题
问题代码: xmal:一个按钮+一个显示框 1 Button Width="100" Height="50" Margin="10" Click="Button_Click"testButton 2 TextBox x:Name="display" Width="300" Height="300"TextBoxcs:点击按钮,显示结果async Taskint getResult(){await Task.Delay(1000)return 10 }private void But
拦截|篡改|伪造.NET类库中不限于public的类和方法
大家好,我是沙漠尽头的狼。 本文首发于Dot9,介绍使用Lib.Harmony库拦截第三方.库方法,达到不修改其源码并能实现修改方法逻辑、预期行为的效果,并且不限于只拦截public访问修饰的类及方法,行文目录:什么是方法拦截? 示例程序拦截 非public方法怎么拦截? 总结1. 什么是方法拦截? 方法拦截是指在方法被调用之前或之后,通过插入自定义的代码来修改方法的行为。通过方法拦截,开发人员可以在不修改原始代码的情况下,对方法的输入参数进行验证、修改方法的返回值、记录方法的调用日志等操作。 本文使用L
6.swagger完善:界面显示注释+多版本控制
周末,写点简单的水一下。 新版本的vs创建项目的时候可以选择自带一个swagger。然而这只是基本的swagger功能。 几个接口无所谓啦,随着接口越来越多,就这么丢给你,一时间也会懵逼,所以这篇文章要做的有两个功能。给swagger文档添加注释 给swagger添加切换“版本”的功能(也可以理解为:让不同功能模块的接口显示在一个页面,不然几十上百的接口放一起找也不好找呀~)右键项目属性生成输出XML文档文件路径,添加输出的路径,我一般会设置在程序集下的根路径,例如这样:文件命名什么的随意,一般跟项目有关
如何在没有第三方.NET库源码的情况,调试第三库代码?
大家好,我是沙漠尽头的狼。 本方首发于Dot9,介绍使用dnSpy调试第三方.库源码,行文目录:安装dnSpy 编写示例程序 调试示例程序 调试.库原生方法 总结1. 安装dnSpy dnSpy是一款功能强大的.程序反编译工具,可以对.程序进行反编译,代替库文档的功能,代码丢失或者损坏可直接恢复,所以能在完全没有源码的情况下即时调试程序,甚至还能修改程序! Github有二进制可执行程序下载地址,也有源码可以自行编译,本文使用前者,Github地址是:https:github.comdnSpydnSpy2
一个简易的ORM框架的实现(二)
框架目标 什么是框架,框架能做到什么? 把一个方向的技术研发做封装,具备通用性,让使用框架的开发者用起来很轻松。 属性:通用性 健壮性 稳定性 扩展性 高性能 组件化 跨平台从零开始搭建框架建立项目 主键查询功能开发 绑定实体一步一步的给大家推导: 一边写一边测试 从零开始搭建框架 1. 创建项目 首先,创建两个类库一个名为Models保存我们的模型一个名为DbProxy的类库保存我们对数据库的核心操作。 先进行我们查询功能的编写,暂时不考虑通用性。 public class DbProxyCe {pub
记一次 .NET 某仪器测量系统 CPU爆高分析
一:背景 1. 讲故事 最近也挺奇怪,看到了两起 CPU 爆高的案例,且诱因也是一致的,觉得有一些代表性,合并分享出来帮助大家来避坑吧,闲话不多说,直接上 windbg 分析。 二:WinDbg 分析 1. CPU 真的爆高吗 这里要提醒一下,别人说爆高不一定真的就是爆高,我们一定要拿数据说话,可以用 !tp 观察下。0:000 !tp logStart: 132 logSize: 200 CPU utilization: 59 % Wker Thread: Total: 6 Running: 6 Idl
5.使用日志+自定义全局异常过滤器
刚开始写文章,封装Base基类的时候,添加了trycatch异常块,不过当时没有去记录日志,直接return了。有小伙伴劝我不要吃了Exception 其实没有啦,项目刚开始,我觉得先做好整体结构比较好。像是盖楼一样。先把楼体建造出来,然后再一步一步的美化完善。 基础的仓储模式已经ok,Autofac已经注入了项目的实现层。上篇文章新建了一个Test类主要用于测试,加了4个接口增删改查,执行也是完全没有问题的。这篇文章开始就是逐步完善优化项目。关于日志有很多选择,我记得上篇我也提到过几个,好,那我就再重复
【解惑】时间规划,Linq的Aggregate函数在计算会议重叠时间中的应用
在繁忙的周五,小悦坐在会议室里,面前摆满了各种文件和会议安排表。她今天的工作任务是为公司安排下周的50个小会议,这让她感到有些头疼。但是,她深吸了一口气,决定耐心地一个一个去处理。 首先,小悦仔细地收集了每个会议的相关信息,包括会议的主题、目的、预计参加人数、所需设备和预计的开始和结束时间等。她需要这些信息来计算所有会议的总时间长度,以便能够合理安排时间表。 小悦开始了紧张的计算。汗水从她的额头滑落,但她顾不得擦,她紧盯着电脑屏幕,手在键盘上快速敲击着。会议室里的空调仿佛失效了一般,让她感觉热浪滚滚,但她
.NET超简单轻量级的HTTP请求组件Flurl
简介 Flurl是一个用于构建基于HTTP请求的C#代码的库。它的主要目的是简化和优雅地处理网络请求(只用很少的代码完成请求)。Flurl提供了一种简单的方法来构建GET、POST、PUT等类型的请求,以及处理响应和异常。它还提供了一些高级功能,如链式调用、缓存请求结果、自动重定向等。本文将介绍Flurl的GET、POST请求功能和序列化功能。 使用流程 1、创建一个APS. API站点,作为Flurl的请求源 在API里分别新建控制器,在控制器中建get、post两个方法。部分方法代码如下[HttpGe
解决WPF+Avalonia在openKylin系统下默认字体问题
一、openKylin简介 openKylin(开放麒麟) 社区是在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区,致力于通过开源、开放的社区合作,构建桌面操作系统开源社区,推动Linux开源技术及其软硬件生态繁荣发展。 “开放麒麟”(openKylin)是中国首个桌面操作系统开发者平台,由国家工业信息安全发展研究中心等单位联合成立,通过开放操作系统源代码的方式打造具有自主创新技术的开源桌面操作系统。 系统镜像下载地址:htt
记录一次:Winform的控件的Visible属性异常问题
一:背景 1. 讲故事 有一次同事找到我,说以下代码中:btnPlanAppend控件:客户电脑显示正常、开发者电脑调试时无法显示btnAppend可以在界面中显示出来 btnPlanAppend控件在界面上就是不显示private void Check_Privilege() {string sPrivilege = ClientUtils.GetPrivilege(g_sUserID g_sFunction g_sProgram).ToString()btnAppend.Visible = Sajet
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理
在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随笔介绍基于WPF开发中,窗口控件脏数据状态IsDirty的跟踪处理操作。 1、WPF的Page页面、Window窗口对象和视图模型 MVVM是ModelViewViewModel的简写。类似于目前比较流行的MVC、MVP设计模式,主要目
Blazor Server 发起HttpPost请求,但是多参数
一、介绍 今天突然想起之前工作上遇到的一个问题,在做Blaz 开发时后端给的一个接口请求方式是Post ,但是他需要携带多个参数,新建一个公共类又觉得麻烦,我就尝试着怎么在Post请求中携带多个参数,由于接触Asp . Ce 的时间不够长,所以这些都不是太了解 今天写下这篇文章做个记录,以免以后用到的时候忘记。如果有什么不对的地方,或者有更好的方法,大家可以在评论区发出来,大家一起学习。二、代码实现 后台就写一个最简单的Post接口,参数暂且先填两个参数,同时这两个参数使用[FromFm]特性,表示这个数