
C#编程
文章平均质量分 67
zxy2847225301
毕业于广东工业大学,多年C#一线开发经验,熟悉常用数据库
展开
-
.NET MAUI教程2-利用.NET CommunityToolkit.Maui框架弹Toast
2 在MauiProgram.cs中新增builder.UseMauiCommunityToolkit();1 在NuGet包管理器中安装。原创 2025-04-11 16:11:48 · 395 阅读 · 0 评论 -
.NET MAUI教程1-入门并发布apk包安装到真机
由于本人水平有限,如有写得不对的地方往指出,由于是使用公司的电脑,电脑的操作系统是英文的,没有权限修改,所以本文截图中的vs是英文版的。选择android仿真器,我的很久之前弄过,所以就有一个默认的Pixel 5 -API 33(Android 13.0-API 33)6 点击vs的调试按钮,如下图,可以看到程序已经在android模拟器中运行了。在vs的菜单栏中的"帮助"菜单中的二级菜单"检查更新"进行更新。然后就可以复制到真实的android机器安装运行了。要经过漫长的等待,然后选择"发布"原创 2025-04-11 15:14:07 · 498 阅读 · 0 评论 -
大屏开源项目go-view二次开发3----象形柱图控件(C#)
下载后修改名称为PictorialBar.png,并放到src\assets\images\chart\charts目录下。8 运行C#后端程序(参考文章最前面给的链接。好了,本文的内容到此结束。这一次是在上一篇博文。原创 2024-12-14 17:17:45 · 958 阅读 · 0 评论 -
大屏开源项目go-view二次开发2----半环形控件(C#)
这个watch函数是获取到接口数据或者导入json文件后,会自动执行该函数,我这里就没有动它(但在做堆叠柱状图的时候就修改了它),你看一下go-view自带的控件,index.vue的内容几乎一样,主要的功能是根据数据更新series的值,从而达到控制控件的目的。这三个玩意有特定的命名规则,key要与前面新增的目录名PieExt2保持一致,chartKey要在PieExt2前面加V变成VPieExt2,conKey要在PieExt2前面加上VC变成VCPieExt2。原创 2024-12-14 16:41:34 · 1310 阅读 · 0 评论 -
大屏开源项目go-view二次开发1----环境搭建(C#)
最近公司要求做一个大屏的程序用于展示公司的产品,我以前也没有相关的经验,最糟糕的是公司没有UI设计的人员,领导就一句话要展示公司的产品,具体展示的内容细节也不知道,全凭借自己发挥。刚开始做时是用wpf做的,wpf调样式非常耗时耗力,做到半成品时给领导看,领导他瞄的说不好看,展示的内容也不行,后面拉了一个群,让其它产品经理提提意见,有一个产品经理不知从哪里找了一张样例图,有些内容可以借用,但有些又得自己想,让我照着这个样例做。我看了一下,他喵的内容和样式全换了,前面做的wpf全白做了。原创 2024-12-14 12:00:29 · 1588 阅读 · 1 评论 -
学习xxx公司连接sql server数据库的代码逻辑(C#)
本文的内容只供参考学习使用,已经按照个人理解做了简化,只是学习,能不能用你自己看着来呗,方便下次直接复制粘贴,如有侵权,请联系删除。1 新建名为Demo4的控制台程序。原创 2024-11-06 17:28:38 · 174 阅读 · 0 评论 -
winform实现托盘语音提醒
3 检测到操作系统被客户点静音后,需要程序控制开启音量(在运行过程中,由于语音重复播放,客户很烦,就会点静音,后面搞了一个在客户点静音后,如果客户一直没处理问题,就在10分钟后重新开启音量播放音频)3 网上找一张icon的图片,重新命名为ico_audio.ico,并放到debug目录,接着网上找一个要播放的mp3音频,并重新命名为"发生药槽错误,请盘点变红的药槽.mp3"MuteMinute为最小音量,为了客户把音量调得过小,小于该音量后,程序自动把音量调大。要上班了,代码就不解释了。原创 2024-10-10 09:06:06 · 512 阅读 · 0 评论 -
winform实现托盘后台运行
3 网上找一张icon图片,重新命名为ico_audio.ico,并放到debug目录。1 新建名为DrawerListen的winform程序。2 默认带出的主窗体重新命名为FrmMain。很简单的东西,代码就不解释了。原创 2024-10-10 08:32:02 · 396 阅读 · 0 评论 -
HttpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭(C#)
使用C#在调试一个第三方的接口时,使用post的方式,json数据格式请求,尝试了各种请求头都没成功,api都换了好几个都不成功,后面了解到没指定ProtocolVersion,我以前调其它厂商的接口都不需要的。如果是json数据格式,需要把ContentType修改为:application/json。转载 2024-08-30 08:20:38 · 818 阅读 · 0 评论 -
利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)
4.1.3 接着使用CvInvoke.Dilate把灰度图的轮廓进行膨胀处理,由于是条形码,所以卷积核用得比较大,用了20*20的卷积核,目的是为了把条形码中的竖线给整合成一个整体。目前能想到的算法是:根据获取到条码轮廓最左边的那个点和最下面的那个点,然后计算这两个点连线,计算夹角,得到对应要旋转的角度A,另外的要旋转的角度为180-A。4.1.6 想要有好一点的识别效果,可以调整第一膨胀的卷积核的大小,图片的清晰度等。把这个压缩包下载下来后解压,展开libs目录的runtimes目录。原创 2024-08-14 14:58:27 · 1354 阅读 · 0 评论 -
利用Emgucv绘制条形码边框16(C#)
4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll。2 把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下。1 新增控制台项目,.net framework为4.7.2。win10 64位。3 项目选择x64。原创 2024-08-13 17:37:48 · 306 阅读 · 0 评论 -
利用C#和Snap7工具模拟S7通信(包含DB地址讲解)
但KepServerEx是收费的,而且模拟的DB块超过64就不行了,当然Snap7在本文中也是只能模拟DB1、DB2和DB3的数据,但Snap7提供了C#版的运行程序,完全可以根据需要修改源码完成要模拟的DB块(由于有一个项目需要,我已经尝试过修改源码成功模拟DB100、DB101、DB102和DB103的数据,后面有空在把代码分享出来)上图中第1个红色方框的十六进制地址为0000,第2个红色方框十六进制的地址为000F,第3个红色方框十六进制的地址为0012,地址排布相信你能看得懂。原创 2024-06-18 21:25:52 · 2558 阅读 · 0 评论 -
Dnspy附加进程调试---代码被优化及无法获取局部变量
Dnspy附加应用程序调试,代码被优化或者无法获取局部变量原创 2024-05-10 10:01:15 · 1167 阅读 · 0 评论 -
一个巧用委托解决的问题(C#)
我是做桌面医疗软件开发的,前段时间在做一个需求。在签发检验项目医嘱时,调用第三方接口,然后带出检验项目对应的采血管医嘱,生成医嘱时,需要调用UI界面的一个方法来获取到医嘱序号,不然会导致报错,而调用医嘱接口的逻辑时在业务逻辑层,不在UI层,所以无法直接调用到UI界面的方法获取医嘱序号,为了遵循系统原来分层的架构,我们不能把调用接口的逻辑放在UI层。业务逻辑层和UI层之间还嵌套其它的交互层,医嘱号的数据类型是int,所以想要在业务逻辑层获取到UI层的医嘱序号,我想到了C#自带的Func委托。原创 2024-04-10 17:29:01 · 436 阅读 · 0 评论 -
利用Winform实现电压表或电流表
本文的内容是搬运而来,还是国外的资源容易获取,不像国内的,遮遮掩掩,各种想让你掏钱。1 新建名为WinformDemo1的winform项目,.net framework选择4.0。2 新建名为AnalogMeterControl的类,并编辑如下。3 生成项目,在工具箱中就可以看到该自定义控件了,如下图。MaxValue是刻度最大值。MinValue是刻度最小值。Value是设置指针的值。好了,本文到此结束。转载 2024-04-03 16:26:19 · 381 阅读 · 0 评论 -
利用Winform实现简陋版的温度计(仅供参考)
本人水平有限,如有写得不对的地方,望指正。为了简单化,做了一个简陋版的温度计控件,有点丑哈。1 新建名为WinformDemo1的winform项目,.net framework选择4.0。设置属性值时同时调用Validate()方法,会触发OnPaint方法进行重新绘制控件。2 新建名为ThermometerControl的类,并编辑如下。3 可以设置它的属性值,Temperature属性是温度值。3 生成项目,在工具箱中就可以看到该自定义控件了,如下图。好了,本文到此结束。原创 2024-04-03 16:08:19 · 569 阅读 · 0 评论 -
利用Winform实现文字滚动(仅供参考)
Label的位置在最右边时,位置的坐标为(自定义控件的Width,Label的y值);Label的位置在最左边时,位置坐标为(0,Label的y值),所以Label在X方向上的值只能在0到Width之间变化。1 先自定义一个继承UserControl的控件,再放置一个Label控件,加一个定时器定时更新Label的x轴的位置即可。Speed是滚动的速度,1到100,如果设置的值小于1,则会自动重置为1,如果设置的值大于100时,会自动重置为100。本人水平有限,如有写得不对的地方,望指正。原创 2024-04-03 15:52:34 · 801 阅读 · 0 评论 -
通过C#和KepServer完成模拟S7协议通信
通过关键词KepServer、C#搜索,发现出来的文章都是关于OPC的,好奇怪,在搜索资料的过程中,了解到了软件博图(不好装,PLC编程的,要求电脑性能高,对操作系统有要求,动不动装不成功,直接劝退了我)、PLC仿真软件。本文作者水平有限,如有写得不对的地方望指正,我以前是做his开发的,没有上位机开发的工作经验,以下内容仅供学习参考使用,趁着有时间就学习一下,没有硬件PLC,只能用KepServer来造数据了。1.5 打开visual studio 2019。好了,本文的内容到此结束。原创 2024-03-17 18:14:20 · 1485 阅读 · 0 评论 -
EF Core入门例子(以SqLite为数据库)
1 新增名称为EFCoreDemo的.net core控制台程序,版本选择.net core 2.1,项目不能放到带中文的目录下,不然到后面执行Add-Migration命令时会报如下的错误。上面的的KnowledgeDataBase.sqlite为SqLite的数据库名称。由于用的是SqLite数据库,会在项目中生成一个名为。6 打开程序包管理控制台,好了,本文的内容到此结束。原创 2024-02-02 11:27:13 · 2141 阅读 · 0 评论 -
dnSpy调试工具二次开发2-输出日志到控制台
NewTestScreen类Execute方法的outputService.Value.Create获取到写日志到控制台的接口,就是借鉴了类OutputLogger.cs中的Initialize_UI方法中的。dnSpy.Debugger项目下的ToolWindows\Logger目录下的类OutputLogger.cs。生成dnSpy项目,并点击dnSpy的"测试新增"菜单,可以看到成功输出了日志到dnSpy的控制台。在LogEditor.cs的这三个地方打上断点。好了,本文的内容到此结束。原创 2024-01-27 21:24:22 · 756 阅读 · 0 评论 -
dnSpy调试工具二次开发1-新增菜单
2 在名为dnSpy的项目下Properties目录的资源文件dnSpy.Resources.zh-CN.resx新增字符串资源(这里配置不同国家语言的资源文件,我的操作系统是中文,所以编辑的是dnSpy.Resources.zh-CN.resx),键的名称:Menu_TestNew 键值:测试新增。其实上面的Header就是绑定到资源对应的中文名称,所以这个一级菜单的名称将会是:测试新增。3 在名为dnSpy的项目下Menus目录的类文件AppMenus.cs新增一级菜单类。原创 2024-01-06 17:47:39 · 1486 阅读 · 0 评论 -
dnSpy调试工具断点信息是保存在哪里的呢
本人是C#开发,dnSpy工具用的比较多,有时候想把有用的断点信息保留下来,挪到别的机器上也能使用。3 打开dnSpy目录,可以看到一个名为dnSpy.xml的配置文件,我们的断点调试信息就保存在这个文件下,当然,那天你看得不爽了,可以直接删掉这个配置文件,下次还会自动生成的。接着去找注册表,也没找到,没办法,只能阅读dnSpy的源码了,经过一翻努力,被我找到了。2 在打开的目录中,我们可以看到一个名为dnSpy的目录(如果没有这个目录,要先打开dnSpy.exe后关闭就可以看到该目录了)原创 2023-12-28 13:18:51 · 860 阅读 · 0 评论 -
调用别人提供的接口无法通过try catch捕获异常(C#),见鬼了
通过反编译看了一下"调用封装CA签名接口的代码块"对应的代码,它的大概处理流程是这样的:先通过Spring.Net接口调用CA签名的业务逻辑,记为业务逻辑A,业务逻辑A的实现流程如下:通过反射,拿到对应的CA签名的实现类(因为我们这边的代码需要兼容多个CA签名的厂商),我们这边对接的是网政通的CA,我这边就只介绍一下它的大概流程:先获取提供接口的CA用户的用户信息,记为步骤1;4 是不是在不同的AppDomain的异常,就捕获不到,后面也尝试过了,也是能捕获的。原创 2023-12-10 12:02:34 · 1511 阅读 · 0 评论 -
C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)
TargetClient.TargetTestClass这个要被篡改方法的TargetTestClass类的全路径(即TargetClient.exe客户端中的类TargetTestClass的全路径,即命名空间+类名)这就可以干很多坏事了,如把别人的系统登录方法该篡改了(不管是混淆过或者没被混淆过的代码,都有方法拿到,这里就不展开了),你懂的。原创 2023-11-10 17:52:34 · 1217 阅读 · 1 评论 -
把wpf的窗体保存为png图片
昨晚在stack overflow刷问题时看到有这个问题,今天早上刚好来尝试学习一下。1 新建.net framework 3.5的wpf窗体程序。原创 2023-11-07 09:21:20 · 1036 阅读 · 0 评论 -
深度学习框架TensorFlow.NET之数据类型及张量2(C#)
TensorFlow中数据的基本单位为张量,前面例子中我们操作的变量或者常量都是属于张量的一中,我们可以使用张量表示标量(0维度数组)、向量(1维数组)、矩阵(2维数组)、RBG图像(3维数组)、视频(4维数组)等n维数组。如:tf.add(number1, number2)是对number1和number2的值相加,可以相加,都是int类型。通过tf.constant(2,name:"常量2名称")声明了一个值为2,名为'常量2名称'的整型常量。声明了一个值为10,名为'int变量'的整形变量。原创 2023-11-05 18:33:05 · 1867 阅读 · 3 评论 -
深度学习框架TensorFlow.NET环境搭建1(C#)
2 在tf.constanct(str)报未能将对象引用到实例,应该是TensorFlow.NET包和SciSharp.TensorFlow.Redist包的版本对应不上,应该多尝试TensorFlow.NET的版本,直到不报错为止。2 分别安装TensorFlow.NET包(先装)和SciSharp.TensorFlow.Redist(后装),版本兼容性不好,最好安装的版本与我的保持一致,不然报错到你怀疑人生。(异常来自HRESULT:0x8007007E)window10 64位。原创 2023-11-05 11:13:22 · 2662 阅读 · 0 评论 -
带你人工识别C#开源库BarcodeLib生成的一维码Code128
1 先把数字如:6986081进行编码,两个数字作为一组进行编码,这里数字69一组,86一组,08一组,剩下一个1就比较特别,源码看得不是很懂,有特殊的规则进行编码。3 通过C#的绘图类Graphics的画线方法.DrawLine进行绘制线,如要绘制10110010000编码,碰到1就纵向绘制一定宽度的直线,碰到0就不绘制直线。通过编码10011100110 查找本文后面的编码表得到的数值为17,但前面有一个CODE_A,应该编码为1。2 把两位数字通过查表法进行编码,编码为11位的0或1数字。原创 2023-11-02 16:58:35 · 1583 阅读 · 0 评论 -
利用win32的GetLastInputInfo函数实现锁屏(C#)
前两天刚好看到群里面讨论这个问题,刚好看到我们系统也有这个功能,就研究了一下,我们这边实现这个功能的目的如下:当用户长时间不操作系统时,自动退出系统并退回到登录界面,想要使用系统,就得重新输入账号和密码。上述代码启用了一个定时器,定时1秒,其中lockScreenSecond是锁屏的秒数,即超过lockScreenSecond秒都没操作电脑就弹出锁屏界面。1 新建winform项目,项目名称为:LockScreen。运行程序后,不做任何操作等待10秒左右弹出锁屏界面。(检测鼠标的位置及焦点事件)原创 2023-11-01 16:31:11 · 1257 阅读 · 0 评论 -
wpf资源Resources探究性学习(一)
你注意观察一下,上图中不同控件下的资源键值key都为txt2,但都不报错,那以那个为准呢,我们大概都能猜到是从里到外进行寻找,如果在Button控件上使用key值,则会先找Button自己定义的,没找到再往上寻找StackPanel中声明的资源,如果还是没找到,则会再会往Window标签寻找。在这里用到了Binding,Source指定的是静态资源stu2,Path指定要显示对应的那个属性,这里是要显示Student2的Name属性,运行程序没有任何问题。assembly=程序集名称"原创 2023-09-20 22:14:33 · 1005 阅读 · 0 评论 -
Winform直接与Wpf交互
2.1 在前文的基础上继续操作(当然咯,这三个PresentationCore.dll PresentationFramework.dll WindowsBase.dll引用是少不了的),新建项,模板选择'用户控件(WPF)',名称为WindowTest。winfrom通过新建项的方式不能直接新建wpf窗体,但我们可以使用新建的wpf的用户控件,然后略做修改就行,当然你也可以添加已有的wpf窗体,这样就可以省略2.1步骤的操作。以非模态的方式(即Show的方式)弹出wpf窗体。原创 2023-09-19 15:58:07 · 2786 阅读 · 0 评论 -
代码控制鼠标光标移动并点击和代码模拟键盘按下(C#)
想要在'触发键盘按下'按钮(名为btnPress)触发自动按钮逻辑,就得通过PointToScreen把控件的坐标转换为计算机桌面的坐标(以前做Unity 3D的时候经常看到这种骚操作),然后把转换后的坐标作为鼠标光标的位置,最后通过模拟鼠标左键按下和抬起,一定要鼠标按下和抬起一起使用才有效,因为鼠标按下和抬起同时完成才算实现鼠标按下的逻辑。演示效果3: 点击按钮,然后控制鼠标光标移动到演示效果1中的那个按钮的位置上,并实现点击,接着就会看到效果1中的效果(模拟键盘输入,把输入的内容显示到文本框上)原创 2023-08-13 18:50:02 · 4573 阅读 · 0 评论 -
打印Winform控件实现简陋版的分页打印(C#)
为了简单起见,纸张大小,打印机等信息按照默认的来,本文的实现方案是:打印Panel中的控件信息,循环进行打印,打印完一张,把信息重新填充到对应的控件上再继续打印。说是要把控件里的内容重新赋值给另外一个控件myControlToDisplay,大概看了一下提供的代码,感觉代码不全,就没有照着来试了。从上往下,就像叠罗汉一样,直到截取并打印完毕,这只是个人的想法,还没验证。读取txt记事本里面的内容,并分页打印,提供的代码。作者的水平有限,如有错误,望指正。好了,本文的内容正式开始。代码太简单了,就不解释了。原创 2023-07-30 17:18:58 · 1284 阅读 · 0 评论 -
打印Winfrom控件实现简陋版的打印(C#)
好了,本水文到此结束。后面还有继续深入研究的,如打印单个控件TextBox,Button,还有实现分页打印等。通过截图的方式进行打印在前面的文章后面已经介绍过,有问题。原创 2023-07-30 15:33:14 · 1308 阅读 · 0 评论 -
Winform中的线程Threading in WinForms(翻译)
而这两个消息队列的区别是,发送到Send Message队列的线程(记为a),把消息发送到队列后,该a线程会堵塞并等主线程执行完消息队列中的消息后,该线程a才会往下执行。同样的,Form_Load中的for循环和AddControl中的for循环并不会并行执行,Form_Load中的for循环和AddControl中的for循环都在主线程执行(即在同一个线程中执行),由于Invoke方法有堵塞的作用,所以会先执行AddControl中的for循环,再执行Form_Load中的for循环。翻译 2023-07-28 09:13:34 · 160 阅读 · 0 评论 -
利用Graphics的CopyFromScreen实现简陋版的打印(C#)
今天趁着有空,就查一下有没有打印Winform的Control控件相关的API,在Youtube中看到了一个视频与之相关的,视频地址:Print contents of WinForms Application using C# and VB.Net。前段时间,在做一个打印的需求,需要把Winform界面的控件及内容全部打印出来,但有一个比较坑的地方是,公司提供的打印API打印单选框,打印单选框时发现选框和内容总是有那么一点点不对齐,看着很别扭。可以看到,任务栏中的菜单都出来了。原创 2023-07-23 16:49:46 · 713 阅读 · 0 评论 -
配置legacyUnhandledExceptionPolicy属性防止处理异常后程序崩溃退出(C#)
依旧没找到解决的方案,上一家另外一个系统的代码就无法获取到了,但我看过,记得是在AppDomain.CurrentDomain.UnhandledException注册的事件中通过代码的方式Dump出文件,但程序依旧还是会崩溃。但我试了一下,并不好使,改变.net framework的版本都试过,不好使,可能是我操作的姿势不对吧。-------------------废话开始,可以跳过不看。-------------------废话结束,可以跳过不看。好了,废话到此结束,正式开始本文的内容。原创 2023-06-17 17:07:28 · 2798 阅读 · 0 评论 -
利用WinDbg查看堆栈中方法入参的值4(C#)
1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题,还得要求用32位的任务管理器导出Dump文件,32位的任务管理器的路径如下:C:\Windows\SysWOW64\taskmgr.exe。可以看到方法WindbgDemo.DownLoadBp.DownLoadOperation中的参数名称为url,对应的值的地址为:0x0000000003222bd8。本文目的,就是查看导出的dump文件中堆栈中的方法参数值,这样方便后续分析问题。threads查看线程。原创 2023-06-11 18:24:04 · 1470 阅读 · 0 评论 -
WinDbg安装入坑3(C#)
1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题,还得要求用32位的任务管理器导出Dump文件,32位的任务管理器的路径如下:C:\Windows\SysWOW64\taskmgr.exe。使用C#编写一段程序,并用64位的任务管理器导出为32位的Dump文件,试一下WinDbg Preview和老版的WinDbg在使用过程中的坑。又是提示版本不一致了,看着有戏,看看是不是64位的任务管理器导出的原因。可以看到导入成功,接着再来看堆栈信息,可以看到成功了。原创 2023-06-11 18:02:45 · 2084 阅读 · 0 评论 -
WinDbg安装入坑2(C#)
1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题,还得要求用32位的任务管理器导出Dump文件,32位的任务管理器的路径如下:C:\Windows\SysWOW64\taskmgr.exe。不管是使用.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll还是使用。可能是我们导入的sos版本不对,由于我们的应用程序是.net framework 3.5 的,可以试试。没有报错,再次输入!原创 2023-06-11 17:13:29 · 1945 阅读 · 0 评论