
c#
以有涯求无涯
.net开发程序员,学无止境
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
关于C#的RSA加密
那么问题来了,在C#的RSA加密工具类RSACryptoServiceProvider中,并没有支持PEM格式公钥为基准的加密方法,只能用一种.net平台认可的xml字符串的公钥才能够进行加密。一般对接第三方的接口时,接口提供方如果要求以RSA方式进行加密传输,并且给了你一串字符串说是RSA加密公钥,那么该公钥一般是PEM格式文件的base64字符串表现形式。另外如果在之后加密时报长度超长之类的错误,说明需要分段加密,因为RSA的加密机制要求:待加密的字节数不能超过密钥的长度值除以 8 再减去 11。原创 2022-09-28 09:31:28 · 9111 阅读 · 0 评论 -
DEV项目部署导出所有依赖的DEV插件dll文件
打开你的VS项目,菜单栏的“工具” 里有 DevExpress Assembly Deployment Tool 菜单,用这个工具可以导出当前项目使用的DEV 相关dll。有一个特别需要注意,如果你用了Dev 里的图标,注意把 DevExpress.Images.v{版本号}.dll 放到你的项目里。转载 2022-06-02 16:32:59 · 719 阅读 · 0 评论 -
DevExpress V14.1报表导出PDF文件文本换行问题
DEV报表导出PDF文件存在缺陷,因为导出PDF时,它的文本换行规则是根据英文语法来的,遇到空格或者英文标点符号,就判断为一个单词的结束,然后看当前行的剩余空间是否足够下一个单词的显示,如果不够,则换行。显然,这是不符合非英文文本的换行需求的,要想修改这个问题,只能用反编译来解决。原创 2022-06-02 16:19:12 · 1179 阅读 · 4 评论 -
sqlserver无需排序查询出行号列
ROW_NUMBER() OVER(ORDER BY(SELECT 0))原创 2022-02-08 16:28:14 · 766 阅读 · 0 评论 -
c#调用动态链接库随笔
例,动态链接库接口函数定义:int __stdcall testMethod(char* InData,char* OutData)字符编码:目标编码调用代码如下byte[] _ruStr = Encoding.Convert(源字符编码, 目标字符编码, 源字符编码.GetBytes("我是入参数据"));string _chuCanStr = "".PadLeft(出参预留长度数值, ' ');byte[] _chuStr = Encoding.Convert(源字符编码, 目标字原创 2021-10-26 15:35:32 · 310 阅读 · 0 评论 -
DEV 报表学习笔记
核心代码,给报表类新增带参构造函数: public XtraReport1(DataSet ds) { InitializeComponent(); DataSource = ds; DataMember = ""; clmDeptCode.DataBindings.Add("Text", ds.Tables[0], "DEPT_CODE"); clmD原创 2021-09-01 18:54:42 · 658 阅读 · 0 评论 -
使用C#方法默认参数的坑
一旦修改了方法中的默认参数,就需要将所有引用该程序集使用该方法的项目全部程序编译……所以说,如果不想全部程序编译,还是老老实实用方法重载吧。原创 2021-08-20 16:22:39 · 235 阅读 · 0 评论 -
解决DEV自定义控件在使用时大小比例发生变化的问题
在控件的初始化代码之中加入以下代码:this.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));原创 2021-03-19 16:30:12 · 701 阅读 · 0 评论 -
C#利用PdfSharp开源类库将图片转换为Pdf并且上传至指定FTP
PdfDocument _pdfDoc = new PdfDocument(); _pdfDoc.AddPage(new PdfPage()); XGraphics _g = XGraphics.FromPdfPage(_pdfDoc.Pages[0]); Bitmap _b = new Bitmap(@"D:\Download\***.jpg"); ...原创 2021-03-11 10:42:56 · 1806 阅读 · 0 评论 -
DEV gridview数据筛选
使用gridview的ActiveFilterString属性进行数据筛选,格式如:gridview1.ActiveFilterString = "[姓名] = '张三' AND [性别] = '男'";原创 2021-03-04 13:38:18 · 1178 阅读 · 1 评论 -
c# TransparencyKey属性设置之后保证鼠标对透明位置依旧有效
只需要将TransparencyKey的颜色(r,g,b)设置为r值与值不同的颜色即可,如255,255,254原创 2021-02-26 09:05:49 · 661 阅读 · 0 评论 -
DEV gridview 获取单元格相对于的屏幕坐标
GridViewInfo info = gridview1.GetViewInfo() as GridViewInfo;GridCellInfo cellInfo = info.GetGridCellInfo(gridview1.FocusedRowHandle, gridview1.FocusedColumn);Point _cellPoint = new Point(cellInfo.Bounds.X, cellInfo.Bounds.Y);Point _screenPoint = gridCon原创 2020-11-26 14:15:06 · 564 阅读 · 0 评论 -
在C#中使用第三方OCX、ActiveX控件
简单直接的三步:一、使用Regsvr32注册指定控件二、生成控件中间代理托管程序集dll文件三、项目添加对代理程序集的引用,并调用其功能详解:第一步:谷歌、百度随你挑第二、三步:两种方式实现:1、VS中右键工具箱点击选择项、在COM组件中选择指定的控件,如果找不到则用浏览功能在本地找到,确定。此时控件便会出现在工具箱之内,直接将其拖入窗口之内,即会为该控件生成托管平台的中间代理程序集,并且直接为项目添加引用。2、使用TlbImp工具为控件创建一个托管代理程序集,项原创 2020-10-22 16:24:32 · 1038 阅读 · 0 评论 -
c#UDP协议通讯
在写具体的用c#实现UDP通讯的方式之前,我们要先搞清楚相关的概念,那就是什么是UDP协议。UDP和TCP一样,是同属于TCP/IP协议簇的传输层协议:这里一定要注意TCP/IP是指一堆协议的集合,而这些集合之中又属TCP协议和IP协议比较重要,所以就将此协议集合以TCP/IP的方式进行命名。那么UDP协议和TCP协议有什么区别呢?TCP协议是面向连接的协议,A端到B端要传输数据则需要进行三次握手建立连接,之后便是点对点的数据通讯,对于数据来说是可靠的。而UDP协议是一种非连接的协议原创 2020-07-01 16:15:51 · 859 阅读 · 1 评论 -
程序集(dll) 安装到 GAC && 程序集添加到VS引用开窗(转)
一 首先 程序集(dll) 安装到 GAC 中的方法 所谓的GAC,就是全局程序集缓存(Global Assembly Cache)。 针对一些类库项目或用户控件项目在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可以调用。被放入GAC的程序集,无论在何处被其他程序集引用,都可以保证自己能够被CLR找到并且加载。简单来说,GAC是一个有规范的目录结构。如果主机使用的是Windows操作系统,并且操作系统被...转载 2020-06-04 13:59:02 · 851 阅读 · 0 评论 -
关于.net项目引用的研究
托管平台项目引用,可以总结为4种:一、直接引用解决方案之内的项目这种引用的实际本质还是把引用项目的路径映射到了项目所编译的dll文件上,这个工作是开发工具替我们做的。使用这种方式在编译时会把所引用项目的编译结果给复制到当前项目的编译路径下。二、通过文件浏览引用类库也是最常用的引用方式,编译时会把引用dll文件给复制到编译路径之下。三、引用GAC(Global Assembly Cache)类库你所使用的任何基础类型,如System.***,都是.net平台类库所提供的,在安装.net原创 2020-06-04 13:25:31 · 633 阅读 · 0 评论 -
c#关于异步线程调用UI的心得
异步线程调用UI更新,一般情况之下为了线程安全,都要用UI对象的Invoke方法用委托的方式进行调用操作UI的代码。切记:若非万不得已,此操作则最好仅用来操作UI更新,不要夹杂无关的逻辑处理代码,不然依旧会耗费界面线程的占用时间,造成反应迟缓或者假死。如,这样写是不对的: private void button1_Click(object sender, EventArgs e) { //开启一个异步线程进行逻辑处理原创 2020-05-30 14:49:45 · 1828 阅读 · 0 评论 -
c#相对路径与绝对路径的快捷转换,随笔
将相对路径转为绝对路径:System.IO.Path.GetFullPath("../../../Lib");将绝对路径转为相对路径: /// <summary> /// 获取一个绝对路径与程序文件的相对路径 /// </summary> /// <param name="path">绝对路径字符串</param> /// <returns></ret原创 2020-05-22 16:57:53 · 1352 阅读 · 0 评论 -
最短的代码理解MEF组件装载框架的核心
using System;using System.Collections.Generic;using System.ComponentModel.Composition;using System.ComponentModel.Composition.Hosting;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApp2{ public interface ILo.原创 2020-05-20 10:36:17 · 252 阅读 · 0 评论 -
关于HRESULT码详解
如果在托管平台调用非托管的COM组件,而在组件之中又引发了错误,那么COM组件会以什么样的形式把错误返回给托管代码呢?答案就是HRESULT。相信许多朋友对该HRESULT码都不陌生,电脑中经常出现一堆莫名其妙的报错,就会给你弹出一堆错误编码,而那个编码,就是HRESULT。所以HRESULT到底是个啥玩意?接着看下去,你就知道了。根据微软提供的文档我们可以得知,HRESULT码是一个32位的数值:HRESULT码结构 0 1原创 2020-05-14 15:38:46 · 2848 阅读 · 0 评论 -
托管平台调用的参数封送
在平台调用中,因为托管类型和非托管类型之间有差异,所以需要进行入参与出参的封送才可正常的调用非托管的函数。在所有要进行封送的参数类型之中,大体分为两种:可直接复制到本机结构中的类型(blittable)和非直接复制到本机结构中的类型(non-bittable)blittable类型转换对照表: Windows 数据类型 非托管数据类型 托管数据类型 托管数据类型解释 BYTE/Uchar/UInt..原创 2020-05-13 14:54:46 · 255 阅读 · 0 评论 -
c#通过动态链接库的方式调用c/c++dll文件时的注意事项
首先,注意相应的参数类型转换,这点自然是不用多说的。其次最好是采用如下的写法在代码中来引入dll文件中的方法,举例: [DllImport("user32.dll",EntryPoint = "MessageBoxA",CharSet = CharSet.Ansi)] public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); priva...原创 2020-05-12 15:42:46 · 304 阅读 · 0 评论 -
c#调用win32api的自动关闭提示框,6种样式
代码: /// <summary> /// 倒计时关闭提示框 /// </summary> /// <param name="hWnd">窗口句柄</param> /// <param name="text">提示内容</param> /// <param name="caption">提示标题</param>原创 2020-05-12 14:44:31 · 770 阅读 · 0 评论 -
托管代码调用非托管代码的方式总结
基于.net开发,托管的便利好处自然不用再多言,垃圾回收、内存管理等等,加之强大的FCL类库作支持后盾,一般情况下我们都不会直接用到非托管代码,一些常用的底层api都已经被FCL类库进行了很好的封装,我们只需要知道用到哪一个类即可。但是类库虽然强大,却非万能的,总有一些基于底层的api没有被封装,或者说程序要调用一些第三方的接口,一般都是c/c++的dll。就我本人所知,许多地区的医疗保险接口便都是非托管代码,如c++写的。在这种情况之下,我们便要考虑到托管代码对于非托管代码的调用问题了,这种技术称原创 2020-05-12 13:21:40 · 1424 阅读 · 0 评论 -
使用.net角色类进行简单的程序权限控制,随笔
代码: private void button1_Click_1(object sender, EventArgs e) { GenericIdentity identity = new GenericIdentity("HU"); GenericPrincipal principal = new GenericPrincipal(identity, new string[] { "1", "2", "3" });原创 2020-05-09 10:41:55 · 211 阅读 · 0 评论 -
关于自定义控件的随笔
在VS设计器中使用自定义控件,需要先保证包含该自定义控件的项目已被成功编译,实际上该控件在被设计器使用之时,部分内部逻辑已经在被调用了,比如说如果重写OnPaint方法,那么其中的逻辑代码便会被调用,就像下面这个简单的控件:using System;using System.Collections.Generic;using System.ComponentModel;using Sy...原创 2020-05-08 17:08:12 · 223 阅读 · 0 评论 -
.net提供的事件委托
在许多情况下,我们需要给类提供事件,把逻辑的触发在本类中进行,逻辑的植入交给调用方。其实我们都知道这不过是委托的一种特殊应用,许多同学都因为要用到自定义事件,就立即想到去定义一个委托。实际大多数情况之下,这都是一种多余的定义,因为.net类库已经给我们提供了适用于事件的委托,下面粗列几种:EventHandler:表示将处理不包含事件数据的事件的方法,是.net类库中事件委托的基类,一般情况下...原创 2020-05-08 15:07:05 · 255 阅读 · 0 评论 -
强转,高度大气上档次,隐转,低调奢华有内涵
甲:TM,又要建一个对象,真烦,就没有省事点的代码么?算啦,写吧: People people = new People(); people.Name = "小胡"; people.Age = 25; people.Profession = "程序员"; people.Sex ...原创 2020-04-28 10:09:48 · 210 阅读 · 0 评论 -
关于c#扩展方法的用处和底层实现的剖析
首先说明,c#扩展方法并不能明显提高程序的处理性能,因为其在底层实现和以往大家所用的静态工具类没有区别,但它但却能缩减代码量,让你的代码更为简洁优雅。更为重要的是,扩展方法可以将你在苦苦回忆静态工具类名称的窘迫中解脱出来。比如说拿string字符串举例子,许多朋友的程序框架之中都存在着处理string字符串的静态工具类,但当他们要用之时,往往还要苦想那个工具类到底叫StringHelper...原创 2020-04-24 17:17:38 · 586 阅读 · 0 评论 -
基于CLR(Common Languge Runtime)高级语言编译运行简解
我们都知道.net号称跨语言的平台,原因就是在于由符合CLS规范的语言所书写的源代码,并非直接编译为汇编指令,而是编译为IL中间语言,再通过JIT即时编译器编译为机器语言进行执行。拿C#举例,其过程就是:C#源代码第一步编译,得到.netmodule模块文件,可以用VS命令行工具手动运行该编译过程(注意,需要先用dos命令切换到源代码路径位置),其指令为:csc /t:module 源...原创 2020-04-17 15:42:50 · 361 阅读 · 0 评论 -
论如何保证C#编写的类库可以正常被其他符合CLS(Common Language Specification)规范的语言引用
CLS规范是CTS通用类型系统(CommonTypeSystem)的一个子集,符合该规范的高级语言皆可在.net平台进行互相引用,这就是为什么称.net平台是一个不关心语言的平台。任何语言,只要你符合CLS规范,你就可以在.net平台畅通无阻。那么,如何保证用C#编写的语言严格的符合CLS规范呢,我们下面举个栗子:如上所示,我编写了一个类库ClassLibrary2,其中的Cl...原创 2020-04-17 10:15:57 · 559 阅读 · 0 评论 -
vs2019使用随笔
有时候会出现一些莫名其妙的引用失效报红线,但是却能正常编译通过,经查找原因应该为IDE的bug,因为重启就好了。原创 2020-04-15 10:21:45 · 445 阅读 · 0 评论 -
调用经Obsolete特性修饰并且无法通过编译的方法的方式
ObsoleteAttribute是.net提供的一个特性,用来描述已过时的程序元素,比如说方法。该特性提供两个参数:其中第一个参数为提示信息,第二个则标识可否通过编译。如果第二个参数传true,则会如下所示:如图所示,调用时报了红线,因此无法通过编译。当然,如果你必须要使用该方法,且具有该方法的源代码,自然可以通过修改其方法特性的入参来实现调用,如下所示:如图所示,我...原创 2020-04-13 11:19:44 · 376 阅读 · 0 评论 -
c# 静态块
静态块会在第一次执行类的初始化方法,或者第一次调用类的静态成员时执行,在整个程序周期只会执行一次。应用场景之一,比如说给静态成员绑定事件。...原创 2020-04-10 14:18:31 · 682 阅读 · 0 评论 -
对依赖抽象的理解
依赖抽象,即为依赖稳定。抽象,是海纳百川的包容性的最高体现,任你翻天覆地,我自巍然不动。原创 2020-04-09 11:08:47 · 418 阅读 · 0 评论 -
c#判断代码是否执行超时的几种方式
第一种,使用委托:第二种,使用Task:第三种,使用Timer:原创 2020-03-30 15:51:59 · 3461 阅读 · 1 评论 -
c# 委托实例的几种执行方式详解
声明委托:首先,绑定委托方法有如下几种方式:第一种,直接对符合委托结构的方法进行多绑定:第二种,绑定匿名方法:第三种,用等号指定单方法:注意,第三种绑定方式会将之前所绑定的方法全部解绑,执行结果如下:如果将第三种的=改为+=,则执行结果如下,会按照你绑定的顺序依次执行:以上,是委托实例对方法进行绑定的几种方式,下面则是委托实例的几种执行方式:...原创 2020-03-30 14:57:47 · 2464 阅读 · 0 评论 -
Event事件与普通委托对象的区别
委托:public delegate void WeiTuo();经event关键字修饰的委托实例:public event WeiTuo WeiTuoEvent;普通委托实例:public form2WeiTuo WeiTuoNorm;经event修饰的委托实例,其访问权限较普通委托实例低,只可在本类之中进行invoke调用。我看许多人说经event修饰的委托实例可以进行多播,也就是...原创 2020-03-30 10:55:38 · 297 阅读 · 0 评论 -
静态常量与动态常量的最直观区别
静态常量在程序编译时给值,且在整个程序编译周期内无法改变,无法做到用配置文件给值,较动态常量灵活性不足,但内存消耗非常低。动态常量在程序运行时给值,且在赋值之后的整个程序运行周期内无法改变,可以做到用配置文件给值,灵活性高,但要消耗一定内存。一般动态常量的运用比静态常量要多一些。...原创 2020-03-30 09:18:11 · 682 阅读 · 0 评论 -
c#判断线程的状态,随笔
判断线程是否为未开启状态或者已停止状态,如果是,则新开线程执行方法,线程的状态判断最好是用&符的方式,不要用==号:if ((conectThread.ThreadState & (ThreadState.Unstarted | ThreadState.Stopped)) != 0) { conectThread = ne...原创 2020-03-25 16:54:28 · 1604 阅读 · 0 评论