C#
xinyue_htx
自建博客https://xinyuehtx.github.io/
展开
-
如何在CefShape中禁用右键菜单
今天遇到了一个在cefsharp中禁用浏览器默认右键菜单的需求,mark一下。问题描述当我们使用默认的cefsharp的ChromiumWebBrowser时,会默认添加一个右键菜单项,如下。实际上,我们业务上往往不需要嵌入浏览器中包含这种右键菜单。或者我们期望自己实现业务需求的右键菜单。那应该怎么办呢?解决方法实际上我们ChromiumWebBrowser暴露了一个MenuHadler属性。这个是一个IContextMenuHandler接口对象。我们可以通过自己实现这个接口,进行注原创 2020-05-15 20:12:16 · 1018 阅读 · 0 评论 -
不要在Directory删除后立刻调用Directory.Exist
今天遇到一个神奇的Directory问题,和大家介绍下。问题描述简单描述下问题,当你调用System.IO.Directory.Delete删除一个文件夹,然后立即用System.IO.Directory.Exists进行判断会概率性返回true。也就是说System.IO.Directory.Exists在检测一个刚刚被删除的文件夹时可能得到错误结果代码如下using System;using System.IO;namespace ConsoleApp2{ class P原创 2020-05-15 19:17:50 · 238 阅读 · 0 评论 -
WPF的RadioButton指定groupname在window关闭后无法check
今天遇到一个神奇的WPF的RadioButton的group问题,和大家介绍下。问题描述英文好的同学可以直接看吕毅 - walterlv同学在github提的issue。最小复现demo,见毅仔的仓库我将一组RadioButton关联到了同一个GroupName下,并且绑定了同一个ViewModel。 <Border> <RadioButton GroupName="A" IsChecked="{Binding Bar, Source={x原创 2020-05-14 17:25:45 · 568 阅读 · 0 评论 -
PPT文档解析之母版
今天和大家介绍下PPT文档解析中的母版。什么是母版我们平时看到的PPT展示,实际上是有多层内容组成的。分别是页面(Slide),布局(SlideLayout)和母版(SlideMaster)我们使用PowerPoint或者WPS打开PPT文件,调到母版视图,就能看到左边列出的母版和布局(或者叫版式)。PPT文件中,可以创建多个母版,每一个母版创建多个布局。在制作PPT时,依赖于不同...原创 2020-03-10 20:15:04 · 1318 阅读 · 1 评论 -
C#代码生成之T4模板组成
我们在使用T4模板进行C#代码生成_C#_黄腾霄的博客-CSDN博客介绍了C#使用T4模板生成代码。今天给大家详细介绍下T4模板的组成T4模板的组成部分T4模板的组成部分如图所示。主要由文本部分,以及非文本部分的指令(Directives)和控制块(Control blocks)组成。下面是一个T4模板示例以及最终的生成效果。文本文本是直接在生成文件中输出的内容。所有的文本元...原创 2020-03-05 18:48:11 · 669 阅读 · 0 评论 -
使用T4模板进行C#代码生成
有过前端开发经验的同学一定了解模板文件的重要用户。其实C#也有类似的模板功能(T4模板),不仅可以生成html文件,还可以生成代码。今天就给大家介绍一下。什么是T4模板T4模板全称是Text Template Transformation Toolkit,因为四个单词的开头字母都是T,所以称作T4模板。T4模板是一种支持C#或者VB代码开发的模板格式,已经在Visual Studio,Mo...原创 2020-03-03 20:04:51 · 1711 阅读 · 0 评论 -
什么是ring0-ring3
大家可能听说过某个代码需要运行在ring 0的说法。但是ring 0究竟是什么,今天就给大家介绍下。权限控制我们都知道计算机中运行着许多的软件,有些软件是和硬件打交道的,比如驱动软件,操作系统软件,有些软件只是运行在操作系统之上的,比如浏览器,文本编辑软件等。为什么要这样设计?这是为了控制运行软件的权限,让一些特定的软件才能执行某些“危险”的行为,比如读写特定的内存等。这里就引申出了我...原创 2020-03-01 16:50:30 · 6273 阅读 · 0 评论 -
Unicode代理对(utf-16)
我们都知道Unicode的大部分字符都是都是使用16位编码,即2个字节表示。这也是为什么正则匹配中,Unicode使用“\uxxxx”进行匹配的原因为什么说是大部分呢?因为还有一个神奇的区域,叫做Unicode代理对。它们需要使用4个字节来表示一个字符。这里就给大家做介绍。问题来源Unicode的产生是为了处理不同语言之间的编码不兼容问题。比如如果中文和日文的不同文字使用了同一个编码...原创 2020-02-29 14:21:01 · 2311 阅读 · 0 评论 -
如何正确的在tooltip中实现绑定
小伙伴们肯定都很熟悉xaml的binding,但是对于tooltip或者popup这些跨窗口的binding总是容易遇到这样,或者那样的问题。这里就给大家提供下关于tooltip的binding方法。我们都知道常见的绑定数据源来自以下几种:DataContextElementNameReferenceSource但是对于ToolTip来说这边就不好直接使用了例如下面的代码使用了E...原创 2020-02-27 09:22:38 · 2847 阅读 · 0 评论 -
什么是尾递归
递归算法想必大家都已经很熟悉了。递归算法虽然简单,但是容易导致一些性能问题,于是就有了尾递归这种优化算法。首先我们先看看递归算法的性能问题是在哪里?比如我们有一个常见的算法,叫做阶乘算法。f(x)=1⋅2⋅3⋯ xf(x)=1\cdot2\cdot3\cdots\!xf(x)=1⋅2⋅3⋯x他的递归实现是这样子的KaTeX parse error: Unknown column al...原创 2020-02-26 13:00:44 · 505 阅读 · 0 评论 -
C#的span元素的优势场景在哪里
Span是C#7.0引入的,它旨在高效使用和管理一段连续的内存。很多人第一次接触它的时候,想不出它的具体使用场景。我第一次接触的时候就会想这个和数组使用有啥区别么?首先看一个例子static void Main(string[] args){ var str = "123456"; var array = str.ToCharArray(); Console.W...原创 2020-02-26 12:56:38 · 1083 阅读 · 0 评论 -
实现一种异步版本的AutoResetEvent
我们在实现一种异步版本的ManualResetEvent_c#,windows_黄腾霄的博客-CSDN博客给大家介绍了异步版本的ManualResetEvent。这里我们自己实现一个异步版本的AutoResetEvent这里是我们创建的异步版本的AutoResetEvent。实现方式和之前的异步版本ManualResetEvent基本相同,也是使用了一个TaskCompletionSourc...原创 2020-02-24 12:57:05 · 372 阅读 · 0 评论 -
实现一种异步版本的ManualResetEvent
我们在使用SemaphoreSlim实现异步等待_c#,windows_黄腾霄的博客-CSDN博客给大家介绍了信号量的异步等待使用方法。可惜的是.NET的ManualResetEvent和ManualResetEventSlim目前都没有提供异步的等待方法。所以我们自己实现一个这里是我们创建的异步版本的ManualResetEvent。实际上这里的本质就是使用了一个TaskCompletio...原创 2020-02-24 12:54:27 · 360 阅读 · 0 评论 -
使用SemaphoreSlim实现异步等待
Semaphore大家应该都很熟悉,一个能够指定最大并发个数的同步锁。实际上.NET还有一个轻量级的信号量实现SemaphoreSlim,其不但能够更加高效的实现信号量的功能,还提供了一个异步等待的API。我们首先回忆下SemaphoreSlim同步等待时的情况。 class Program { private static SemaphoreSlim sem...原创 2020-02-24 12:51:42 · 1959 阅读 · 0 评论 -
构造PipeAccessRule时请不要使用字符串指定Identity
一段运行了很久的命名管道程序,在俄语系统出现了奔溃,揭开了一个尘封已久的bug。公司的软件最近迁移到俄语系统上,然后出现了一个奔溃异常,如下图(已经隐去了关键信息)异常显示了在PipeSecurity添加PopeAccessRule时出现了IdentityNotMappedExceptionIdentityNotMappedException是什么首先我们需要了解什么是SID。win...原创 2020-02-24 12:44:43 · 322 阅读 · 0 评论 -
C++/CLI的Ref和Out使用
最近在搞C++/CLI,发现经常需要涉及Ref和Out的使用,因此记录下。C++/CLI 是一种.NET语言,因此其可以像C#一样使用Ref和Out为函数参数进行标识。首先我们看看Ref,这个是表示对对象的地址进行传递,所以很简单传递一个地址符号即可我们将这个方法引用到一个C#项目中,可以看到vs帮我们加上了ref关键字首先我们需要知道的是,CLR层面是没有out这个用法的,他的本质...原创 2020-02-23 14:22:11 · 1823 阅读 · 0 评论 -
C++/CLI的托管字符串std字符串和c字符串的转换
最近在搞C++/CLI,发现经常需要涉及字符串之间的传递和转换,因此记录下。在C++/CLI中,我们可以接触到三种字符串std::string,System::string,cstring。这里我们分别称之为标准字符串,托管字符串和c语言字符串。std::string 和 cstringcstring是一个char数组,在string.h 中直接定义了c_str方法完成std::strin...原创 2020-02-23 14:20:04 · 808 阅读 · 1 评论 -
C++/CLI的设置CLR枚举
最近在搞C++/CLI,发现我在其中写的enum居然不见了,这个是怎么回事呢。首先我们在C++/CLI项目里面建立一个enum当我们将其在c#项目中引用时,神奇的事情发生了,这个枚举的枚举值不见了。现在我们试着给枚举值做一点改变,加一个class枚举又正常了。实际上在C++/CLI中我们可以定义两种枚举类型,不加class关键字的是标准C++枚举,加class关键字的是托管枚举...原创 2020-02-23 14:17:30 · 790 阅读 · 1 评论 -
合字研究——看看藏文里面一共有多少个字吧
还记得我C#使用StringInfo正确查找字符个数_C#,unicode_黄腾霄的博客-CSDN博客这篇博客么?你们以为2个Unicode组成的emoji就是极限了么?这篇文章会带你们体验下世界语言的博大之组合字。组合字就是说对于某些精妙的语言,多个单独可渲染的文字,放在一起后就会渲染成一个文字。其中最著名的就是我们的藏文。下图是wiki上的说明,大致意思就是一个藏文基字可以通过加加加...原创 2020-02-22 10:19:24 · 1971 阅读 · 1 评论 -
C#使用StringInfo正确查找字符个数
之前在处理文本的时候遇到过这样的一个问题,有的字,它看着是一个,但是程序说他是两个,但是实际真的是一个。好吧,你们一定没有听懂我在讲什么。没关系一起来看看代码假如有这么一个字符串“黄腾霄好瘦哦”,需要使用程序找出这个字符串包含几个字,怎么找?var s=“黄腾霄好瘦哦”;var len=s.Length;很简单是不是。那再看看这个字符串,“黄腾霄也能算瘦????”,不出意料的话应该是8个字...原创 2020-02-22 10:12:40 · 2594 阅读 · 0 评论 -
C++/CLI委托回调
我们都习惯了在c#中使用事件,但是c++中没有默认的事件机制,所以在编写c++/cli时,这将是一个令人困扰的问题在c++中常见的方式是传入一个回调,在特定的时机,通过调用回调函数,执行上层的代码。这种方式能够解决一部分场景的问题,但是另外一些场景,比如事件的invok列表,责任链模式都不能实现。另外常见的回调对象,要求一次实现多个回调函数,这样容易将各个业务的处理都聚集在同一个回调对象中...原创 2020-02-21 10:06:41 · 1112 阅读 · 0 评论 -
使用DispatchProxy生成代理
最近在做RPC的时候遇到了一点问题,接口I的调用方在进程A,而实现方在进程B。那么要完成进程A中的操作,必然要在进程A生成接口I的动态代理。怎么办呢?这里使用DispatchProxy来进行实现DispatchProxy是一个抽象类,使用方法非常简单。只需要继承这个类,重写他的Invoke方法,这里我们可以从参数获得代理被调用方法的MethodInfo以及其传入的参数。这里我们先试着打印他的方...原创 2020-02-21 09:57:31 · 1375 阅读 · 0 评论 -
WPF文本(2)-当显示文本时我们到底在做什么(2)
上一讲我们介绍了如何获取文本字符,这一讲介绍文本的布局我们之前在WPF文本(1)-当显示文本时我们到底在做什么(1)_wpf,c#_黄腾霄的博客-CSDN博客介绍过,文本渲染需要经历找字符、measure、arrange、render过程。这里我们统一介绍measure和arrange过程(Layout过程)Layout首先我们思考下一群文本字符应该怎么对齐呢?上对齐?下对齐?并不是,这...原创 2020-02-20 09:58:18 · 173 阅读 · 1 评论 -
WPF文本(1)-当显示文本时我们到底在做什么(1)
文本显示是任何软件最重要的功能之一。但是很少有同学去关注文本的底层运作原理。这个系列将会介绍什么是文本的一些逻辑,以及如何利用我们的WPF现有接口,对文本进行最大程度定制化。首先我们要明确,对于软件布局渲染来说,无论是文本,图片还是其他控件,其根本操作都是在指定区域显示指定大小的特定图像。由此我们可以推出,软件要完成某个特定对象布局渲染,需要1、测量对象的指定大小以及可以用于布局渲染的空间大小...原创 2020-02-20 09:55:40 · 385 阅读 · 0 评论 -
为什么WPF在code behind使用RelativeSource的binding会出现错误
不知道是不是有小伙伴遇到过这样的情况。当我们尝试将一个RelativeSource从xaml转到code behind时,原本好好的binding表达式居然出现binding错误。我们来做个实验,我们创建了一个UserControl里面有一个TextBlock,其Text属性绑定了类型为Window的父元素的Title。而我们的window里面的title写了"黄腾霄瘦瘦瘦"这个美好的祝愿。(...原创 2020-02-20 09:51:43 · 415 阅读 · 0 评论 -
使用C#代码启动服务
今天我们来实现使用代码处理windows服务的启动或者关闭处理windows服务的启动和关闭实际上我们需要关注两个事情。第一个是设置服务的启动类型——手动、自动、自动(延时启动)、禁用,第二个是控制服务的状态——启动、停止、暂停、恢复。毕竟如果服务被禁用了,你也没法启动呀OK,我们开始处理启动类型。启动类型实际上就是服务对应的注册表的一个键值他存储在计算机\HKEY_LOCAL_M...原创 2020-02-19 09:19:42 · 1466 阅读 · 0 评论 -
为什么MessageBox会跑到窗口下面
我们在一个窗口调用MessageBox.Show方法会在,该窗口制造出一个模态的消息框。但是有小伙伴最近问我他发现这个消息框经常会到窗口下面显示。出现问题我们来看下他的代码,很简单完全没有问题是不是但是在实际运行中,其中的一个方法Foo抛出了一个异常。而作为代码书写者,为了确保软件的正常运行,将这个方法的所有异常都吞掉了。此时导致的结果就是,用户端看到软件运行正常,但是没有期望的输出...原创 2020-02-19 09:17:24 · 1450 阅读 · 0 评论 -
如何利用c#找到物理网卡的Mac地址
我们经常会在代码中查找设备的Mac地址,以确认设备的唯一性。但是如果你的设备安装了一些虚拟机,这个时候就会比较麻烦了出现问题看一下我这边通过ipconfig /all 跑出来的结果,大家猜猜看,哪个才是我的物理网卡呢?看名称?看描述,看NetBIOS启用状态?唉,都不靠谱,你能想到是第一个标着fake_wlan,描述带Hyper-V的才是我的物理网卡么?How那么如何才能去找到我们的...原创 2020-02-19 09:15:50 · 970 阅读 · 0 评论 -
FirstChanceException原理
异常处理是代码中很重要的一项注意点。但是有时候一些不恰当的异常处理,反而会影响我们在代码运行时的调试。出现问题假如我们有这么一段代码,我期望调用Bar方法,输出“黄腾霄是帅哥”。但是在实际运行中,其中的一个方法Foo抛出了一个异常。而作为代码书写者,为了确保软件的正常运行,将这个方法的所有异常都吞掉了。此时导致的结果就是,用户端看到软件运行正常,但是没有期望的输出 static v...原创 2020-02-18 09:59:04 · 677 阅读 · 0 评论 -
task.yield的使用场景研究
出让执行权:Task.Yield, Dispatcher.Yield - walterlv,毅仔的博客珠玉在前。同学们可以直接跳转过去看。比较遗憾的是我没有在里面找到Task.Yield的合适的应用场景。关于Task.Yield的应用场景也是争论纷纷,可见这个东西必然很鸡肋。本文尝试了Task.Yield的几种使用场景,看看是否能够将代码变得更加优雅。坐在MVP旁边狗尾续貂,诚惶诚恐。。R...原创 2020-02-16 09:27:51 · 834 阅读 · 0 评论 -
使用resharper进行编译期间判空
NullReferenceException一定是大多数程序员最讨厌的异常之一我们在书写代码时看到NullReferenceException一定很崩溃,但是更崩溃的事情是在团队协作时,小伙伴写的方法给你返回了一个Null本着己所不欲勿施于人的观点,我们应该选择一种方式或者契约让可能会出现Null的地方,告知到其他的小伙伴这里推荐的是Resharper的CanBeNull标记。CanBe...原创 2020-02-15 09:39:08 · 188 阅读 · 0 评论 -
手把手教你PInvoke
当你写久了应用层代码,是不是需要来玩一下硬件呀?这个时候你就会接触到一些美妙的dll,比如user32.dll,kernal32.dll当然这些是非托管的代码,我们在.net中无法直接使用,所以我们会需要使用PInvoke进行调用于是你会使用DllImport特性标记一个方法,引入非托管函数比如 我们希望弹出一个消息框,就会使用下面这个函数,添加DllImport特性,表明从哪个dll引...原创 2020-02-15 09:35:10 · 3814 阅读 · 0 评论 -
使用C#模拟键盘输入
假如你想做一个模拟键盘对当前的Active进程进行输入,该怎么办呢?今天就介绍一个如何利用C#实现编程法模拟键盘输入今天我们使用的是System.Windows.Forms.dll中的SendKeys这个类这是一个静态类,主要有两个方法Send表示发送后立刻返回,SendWait表示发送后等待其他应用程序处理最简单的,对于基本字符,我们直接发送对应字符即可比如你想模拟键盘输入A,只要写...原创 2020-02-15 09:29:23 · 3971 阅读 · 0 评论 -
C#元组投影初始值设定项
使用过命名元组的同学都知道,命名元组可以使用“有意义的字段名”来代替Item,用于表示元组的成员。在C#7.1中引入了“元组投影初始值设定项”(tuple projection initializers)提升了命名元组的编程体验一般情况下,我们会采用下面这种方式进行命名元组的创建var firstName = "Huang";var secendName = "Tengxiao";var...原创 2020-02-14 09:17:42 · 297 阅读 · 0 评论 -
C#元组的相等性比较
元组作为轻量级的数据结构,在c#中具有广泛的引用。但是元组的比较一直以来都是对于成员的依次比较。好在C#7.3开始,引入了元素的相等性比较,让元组的易用性有了大幅提升。绑定微软对此的介绍是“从 C# 7.3 开始,元组类型支持 == 和 != 运算符。 这些运算符按顺序将左边参数的每个成员与右边参数的每个成员进行比较,且比较是短路计算”所以我们可以写出这样的代码,对元组进行比较var l...原创 2020-02-14 09:15:04 · 667 阅读 · 1 评论 -
C#中的弃元
从 C# 7.0 开始,C# 支持弃元,这是一种在应用程序代码中人为取消使用的临时虚拟变量。使用过ConcurrentDictionary<T,T>的同学肯定经历过这样的痛苦var dict = new ConcurrentDictionary<int,int>dict[1]=1;var result = dict.TryRemove(1, out var val...原创 2020-02-14 09:13:35 · 2009 阅读 · 0 评论 -
wcf入门(15)——绑定介绍
本文demo已上传至github:xinyuehtx/WCFdemo这篇文章将会介绍binding绑定绑定是用于配置wcf如何进行endpoint的对象,其包括协议配置(如wcf入门(14)——可靠会话_wcf,c#_黄腾霄的博客-CSDN博客用到的可靠会话配置),消息编码方式(如文本编码,二进制编码),底层传输方法(如tcp)。不同的绑定能够支持的wcf服务功能也不同。作为入门教程,这...原创 2020-02-11 11:50:04 · 184 阅读 · 0 评论 -
wcf入门(14)——可靠会话
本文demo已上传至github:xinyuehtx/WCFdemo在之前的wcf入门(6)——服务会话_wcf,c#_黄腾霄的博客-CSDN博客博客介绍了wcf的会话,这一篇介绍可靠会话可靠消息传输在了解可靠会话之前我们需要先了解下什么是可靠消息传输(Reliable Messaging)。我们知道网络数据在传输过程中,丢包,乱序都是一种很常见的情况。对于某些软件,数据的完整性和有序...原创 2020-02-11 11:46:43 · 218 阅读 · 0 评论 -
wcf入门(13)——异步代码超时研究
本文demo已上传至github:xinyuehtx/WCFdemo在之前的wcf入门(12)——异步调用_wcf,c#_黄腾霄的博客-CSDN博客博客介绍了wcf的异步,但是发现一些小伙伴没有注意到的问题。因此做一些补充实验异步代码会导致超时么上一次我们发现当返回值至task时,消息一旦发出,线程就会继续执行。那么继续利用上一个博客的例子,我们尝试将delay增加到3min,然后检查输...原创 2020-02-11 11:39:11 · 142 阅读 · 0 评论 -
wcf入门(12)——异步调用
本文demo已上传至github:xinyuehtx/WCFdemo这个博客会介绍如何设置服务的异步调用之前在介绍wcf入门(3)——请求答复模式_黄腾霄的博客-CSDN博客请求答复模式时,提到了异步服务操作。实际上在C#5引入基于任务的异步模型(TAP,async/await)之后,异步的wcf服务变得非常简单。异步实现首先在定义接口时,将返回值改为Task<T>,表明这...原创 2020-02-11 11:20:56 · 327 阅读 · 0 评论