C#专栏
文章平均质量分 86
zhuweisky
微信号:oraycn。持续专注于即时通讯、实时音视频领域。平台涉及Windows、Linux、Android、Web、信创国产软硬件平台。
展开
-
Avalonia 实现简单的IM即时通讯、视频通话(源码,支持国产系统,统信、银河麒麟)
Avalonia 在跨平台上的表现非常出色,对信创国产操作系统的支持也很不错。现在,我们就来使用 Avalonia 实现一个跨平台的简单IM,除了文字聊天外,还可以语音视频通话。原创 2023-11-22 09:30:23 · 636 阅读 · 0 评论 -
Avalonia 实现跨平台的视频聊天、屏幕分享(源码,支持Win、银河麒麟、统信UOS)
Avalonia 是现在最流行的C#跨平台UI框架,如果要基于Avalonia 实现视频聊天和远程桌面控制,那么要如何实现了?原创 2023-10-16 14:28:28 · 2081 阅读 · 2 评论 -
实现Linux 视频聊天、远程桌面(源码,支持信创环境,可与Windows版、安卓版互通)
本文讲述如何实现跨平台的视频聊天、远程桌面/屏幕分享 系统(Windows、Linux、Android),并让其支持在国产操作系统(如银河麒麟,统信UOS)和国产CPU(如鲲鹏、龙芯、海光、兆芯、飞腾等)上运行 。原创 2023-07-04 14:34:29 · 2890 阅读 · 3 评论 -
实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)
信创是现阶段国家发展的重要战略之一,面对这一趋势,所有的软件应用只有支持信创国产化的基础软硬件设施,在未来才不会被淘汰。本文讲述如何使用C#来实现视频会议系统的Linux服务端与Linux客户端,并让其支持国产操作系统(如银河麒麟,统信UOS)和国产CPU(如鲲鹏、龙芯、海光、兆芯、飞腾等)。原创 2023-06-06 15:08:50 · 1252 阅读 · 0 评论 -
实现聊天消息绘制、图文混排(源码,支持Windows、Linux)
在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时,就更加麻烦了。那么有简单的实现办法吗?嗯,有的。原创 2023-02-16 15:03:07 · 496 阅读 · 0 评论 -
Linux开源IM GGTalk 8.0发布,支持在统信UOS、银河麒麟上运行!
开源即时通讯系统GGTalk 8.0正式发布!支持的客户端已经包括:Windows、Android、iOS、Linux、国产OS。最新源码分享给大家!原创 2022-09-18 15:46:33 · 1519 阅读 · 5 评论 -
视频会议中的混音实现
在定制开发视频会议系统时,有客户需要将视频会议的过程录制下来,这就必须要用到混音器组件。 一个视频会议有多个用户参与,每个用户都有自己的声音,我们需要将多路声音数据经过混音后,再输出给录制器进行录制。............原创 2022-06-26 08:32:04 · 761 阅读 · 0 评论 -
实现C++调用C#的动态库dll
在实际的项目过程中,有时会遇到在C++的项目中调用某个C#的dll来完成特定的某个功能,我们都知道,Native C++是没办法直接调用.NET平台的dll的。那有没有办法来做到这一点了?答案是肯定的。原创 2022-06-05 09:24:41 · 2514 阅读 · 0 评论 -
C#实现屏幕共享时的多人实时标注
在视频会议系统中,经常会有这样的需求:参会人员A共享了自己的屏幕给大家观看,人员B则需要在屏幕图像上做标注,并且希望所有的与会人员都能看到他做的标注。 这个功能通常被称为共享屏幕标注、或屏幕标注、或带标绘功能的远程桌面。一.实现方案 将这个功能拆解开来,实际上就是 远程桌面 + 电子白板,我们可以在远程桌面的控件上叠加一个背景透明的电子白板就可以实现这样的效果。 接下来,我们尝试使用 OMCS 的远程桌面组件和电子白板组件,来实现这个功能。具体而言,我们在OMCS入门...原创 2021-07-05 15:32:55 · 1427 阅读 · 1 评论 -
C#推流RTMP,摄像头、麦克风、桌面、声卡(附源码)
这段时间一直都在研究推流的技术,经过断断续续将近两个月的摸索实践,终于能稳定地推流了。 这个demo的主要功能就是将采集到的摄像头或桌面的视频、以及麦克风或声卡的音频数据推到Nginx-RTMP服务器上,再由Web浏览器去拉流并播放。 接下来介绍Demo整个功能的实现原理和代码逻辑,大家可以从文末下载源码后,对照源码再来看下面的介绍就会更清晰些。一.客户端实现 客户端的界面效果图如下所示: 客户端的具体功能:可以采集摄像头或者桌面图像,也可...原创 2020-11-25 15:10:10 · 6748 阅读 · 6 评论 -
如何实现:手机监控PC桌面?(附源码)
最近做了一个项目,里面有涉及到监控PC桌面和监视手机屏幕的功能,客户需要在PC电脑上和安卓手机上都能够观看对方的屏幕,而对方的设备既可以是PC电脑,也可以是安卓手机。 为了便于以后复习,我把这个屏幕监控的功能单独提出来做了个Demo名为ScreenMonitor来记录备忘,顺便也分享给大家。 该Demo一个包括3个项目:服务端、PC客户端、安卓客户端。 文末除了将ScreenMonitor整个项目的源码提供下载,也专门给出了可以直接部署的版本,供大...原创 2020-10-14 14:16:44 · 4486 阅读 · 0 评论 -
C#多线程笔记(一)
1.每个窗体都有自己的都在不同的线程上运行,如果需要在窗体之间交互,就需要在线程之间交互。2.当线程Sleep时,系统就退出执行队列一段时间,当睡眠结束时,系统会产生一个时钟中断,从而使线程回到执行队列中,从而恢复线程的执行。3.如果父线程先于子线程结束,那么子线程将在父线程结束的同时被迫结束。Thread.Join()方法使父线程等待,直到子线程结束。 Abort()方法带来的后果是不可恢复的终原创 2004-08-26 16:19:00 · 4516 阅读 · 0 评论 -
.NET :消息与AOP(一)
原创 2004-08-26 16:25:00 · 1672 阅读 · 0 评论 -
.NET :消息与AOP
一.基本知识点方法调用与消息 如果一个目标对象委托给一个真实代理实例,那么所有对对应的透明代理的方法调用都会经过一个消息转换与反转换的过程,而 正是将方法调用转换为消息后,我们才有机会实现预(后)处理,这样更进一步的结果是 ==》 实现所谓的AOP。1. 真实代理:从RealProxy派生,最主要的是复写Invoke方法。Invoke方法的主要职能是为截获方法调用加上预(后)处理,以此来实现AOP原创 2004-08-26 16:27:00 · 2731 阅读 · 2 评论 -
C# AOP微型框架实现(二)
3. AopProxyAttribute AOP代理特性/****************************** AopProxyAttribute ************************************using System;using System.Runtime.Remoting ;using System.Runtime.Remoting.Proxies ;原创 2005-07-01 15:13:00 · 5196 阅读 · 0 评论 -
C# 完成端口组件实现
前面用C++实现了windows平台上的网络完成端口组件,那么到C#中如何做了?起初我打算通过PInvoke来调用win底层API来仿照C++实现,但问题很快就出来了--C#中的Unsafe指针无法稳定的指向一块缓冲区的首地址,也就是说当垃圾回收进行的时候,我们的unsafe指针的值可能已经无效了。用pin?我也想过,可是锁住所有的TCP接收缓冲区,会极大的降低运行时的效率。难道没有办法了吗?想想原创 2005-07-01 16:31:00 · 6896 阅读 · 21 评论 -
ISingletonDisplayer 单件模式显示器C#实现
很多情况下,我们需要一个Singleton窗体,比如,任务管理器就可以是windows应用系统中的一个Singleton,于是我们这样做:在窗体类的实现中添加一个静态指向单件的成员,提供一个静态的CreateInstance方法,当第一次调用此方法时创建单件。另外还要处理Closing事件,以使点击窗体右上角的“×”时,隐藏窗体。每次需要实现一个单件窗体时都要这么做,于是我决定写一原创 2005-07-02 20:19:00 · 1825 阅读 · 2 评论 -
C# AOP微型框架实现(一)
在前面的系列文章中,我介绍了消息、代理与AOP的关系,这次将我自己实现的一个AOP微型框架拿出来和大家交流一下。AOP的最基本功能就是实现特定的预处理和后处理,我通过代理实现了此微型框架。先来看看构成此微型框架的4个.cs文件。1.CommonDef.cs 用于定义最基本的AOP接口/************************************* CommonDef.cs ******原创 2005-07-01 15:08:00 · 6738 阅读 · 1 评论 -
使用AOP微型框架的例子
在基于前两篇文章给出的AOP微型框架的实现的基础上,我们可以写个例子来测试一下了:) public class AopControlProxyFactory : IAopProxyFactory { #region IAopProxyFactory 成员 public AopProxyBase CreateAopProxyInstance(MarshalByRefObject obj,原创 2005-07-01 15:14:00 · 2806 阅读 · 1 评论 -
排序二叉树C#实现
很久以前写的,现在贴出来交流一下。先看排序二叉树的接口public interface ISorttedBinaryTree { void InsertElement(IComparable val) ;//如果树中有一个节点的值等于val的值,则val将被忽略 void RemoveElement(IComparable val) ; bool ContainsElemen原创 2005-07-02 20:33:00 · 2660 阅读 · 0 评论 -
二叉树绘制器BinaryTreeDrawer实现
我们可能需要将一个二叉树以图形化的方式显示出来,我实现了一个二叉树绘制器BinaryTreeDrawer,用于绘制前文实现的二叉树。先看看这个绘制器的外貌:public interface IBinaryTreeDrawer { void Initialize(DrawerParas paras) ; void ResetGraphic(Graphics g) ; //在设备发生变化或原创 2005-07-02 20:41:00 · 3518 阅读 · 0 评论 -
可复用的自动升级系统实现(一)
相对于B/S结构来说,C/S模式的客户端的部署和升级是一个很大的麻烦。有很多企业用户就是因为这个原因而放弃使用C/S。然而当一个应用必须要使用C/S结构才能很好的实现其功能的时候,我们该如何解决客户端的部署与自动升级问题了?部署很简单,只要点击安装程序即可,难的在于每当有新版本发布时,能够实现自动升级。首先,我需要把自动升级的概念扩展一下。自动升级不仅仅是把当前版本的主程序EXE或原创 2005-07-06 11:39:00 · 5157 阅读 · 0 评论 -
万能对象池【C#实现】
如果一种类型的对象需要经常被创建、销毁,为了提高性能,我们通常需要使用“池”技术,就如线程池、TCP连接池等一样。那么需要使用池技术的对象一般有哪些特征了?(1)创建过程耗时(2)不需要保存客户状态(3)对象体积较大(4)频繁创建/销毁 为了省事,我希望实现一个万能对象池组件,该对象池可以缓存任意类型的对象。下面给出对象池的接口: public interface IObjectPo原创 2005-07-19 18:26:00 · 11309 阅读 · 2 评论 -
C#资源管理
C#资源管理(2004.10) 资源是在逻辑上由应用程序部署的任何非可执行数据。资源可以在应用程序中作为错误信息显示,或者作为用户界面的一部分显示。资源可以包含多种形式的数据,包括字符串、图像和持久的对象。通过在资源文件中存储您的数据,您无需重新编译整个应用程序即可更改数据。请注意,为了将持久对象写入资源文件,这些对象必须是可序列化的。原创 2005-07-20 14:28:00 · 2549 阅读 · 1 评论 -
多线程 C#解决方案小结
多线程 C#解决方案小结(2004.09) 与多线程相关的两个常见的需要解决的问题是:临界资源保护和线程间的同步依赖,每一种语言都提供了自己的一套设施(有的语言可能需要借助OS的API)来解决这两个问题,C#提供了更方便灵活的解决方案,首先C#可以允许我们在不同的级别上加原创 2005-07-20 14:18:00 · 2112 阅读 · 0 评论 -
实现你自己的分页管理器
在DataGrid的web版控件中提供了自动分页的功能,但是我从来没用过它,因为它实现的分页只是一种假相。我们为什么需要分页?那是因为符合条件的记录可能很多,如果一次读取所有的记录,不仅延长获取数据的时间,而且也极度浪费内存。而分页的存在的主要目的正是为了解决这两个问题(当然,也不排除为了UI美观的需要而使用分页的)。而web版的DataGrid是怎样实现分页的了?它并没有打算解决原创 2005-08-19 17:56:00 · 2632 阅读 · 6 评论 -
AOP应用之权限管理
在系统实现中AOP常用于并发、权限管理、事务处理、日志记录、错误处理方面。本文介绍如何使用EnterpriseServerBase类库中的AOP框架来实现权限管理。一个用户是否有权限调用某个操作(方法),是由我们的应用决定了,不同的应用有不同的实现,但是,如果需要使用EnterpriseServerBase类库中的AOP的权限管理,则应用必须实现下面的接口IPermissionVerifier:/原创 2005-08-23 17:32:00 · 9259 阅读 · 32 评论 -
操作数据库系统信息
在我们的程序中,如何新建一个数据库?如何判断一个数据库是否存在?数据库的系统信息是怎样的?如何新建一个数据库表?如何得到一个数据库中所有的表明?等等这些任务,使用程序如何完成?这篇文章所展示的DBSystemHelper类将助你完成这些任务!DBSystemHelper是EnterpriseServerBase类库中DataAccess.DbSystem下的一个帮助类。类中所用到的原创 2005-08-18 10:06:00 · 2197 阅读 · 0 评论 -
异常处理经验谈
1.异常处理相对于返回错误代码的一个最大优点在于,异常可以被自动传递,这样,在编程时异常更加难以被忽视。2.通常,只在最上层(一般是UI层)捕捉异常。如果要在其它层捕捉异常,除非是下列情况之一: (1)能够处理该异常,或者 (2)能够忽略该异常,或者 (3)需要转换该异常为其它特定异常后抛出新异常3.UI层捕获异常后,可以 (1)将无关紧要的异常忽略。 (2)将异常转换为错误信息展现给用户。 (3原创 2005-08-23 14:41:00 · 2934 阅读 · 0 评论 -
ESBasic 可复用的.NET类库(01) -- 时刻 ShortTime
(如果您能对照着源码来阅读本文,效果会更好。) 1.缘起: 假设我们的员工打卡系统,需要设定公司规定的上班时间、下班时间、以及还要对员工是否迟到早退等这些情况进行判断。 我们以什么方式来记录类似上下班时间这样只有时分秒没有年月日的时间了?你说可以使用DateTime,但是合适吗?总是觉得用DateTime来表示上下班的时间很别扭,因为我们的上下班时间并需要指原创 2009-08-26 10:11:00 · 1246 阅读 · 0 评论 -
在应用程序之间传递动态程序集
所谓动态程序集,就是在运行期间由Emit创建的程序集。 假设,我们的Client和Server之间通过Remoting通信,在某个时刻,Client会创建一个动态程序集,并且Client和Server都会基于该程序集做一些动作,那么如何将动态程序集传递到Server端了?Client和Server如何正常使用这个程序集了? 我的经验是这样的:(1)Clie原创 2009-08-13 10:50:00 · 751 阅读 · 0 评论 -
关于【对象“***.rem”已经断开连接或不在服务器上】异常的解决方法
假设,Remoting服务端接受并保存了一个Remoting客户端注册的回调接口(比如ICallback),在一定的时刻,服务端会通过ICallback接口调用客户端的某些方法。当运行一段时间后,服务端再次回调ICallback时,就抛出了类似下面的异常: 对象“/9ca38d87_7f53_49b7_8c81_f2d499239f27/jqgpmhyy_rwcmic原创 2009-08-11 11:51:00 · 2703 阅读 · 0 评论 -
TopN算法与排行榜
在系统中,我们经常会遇到这样的需求:将大量(比如几十万、甚至上百万)的对象进行排序,然后只需要取出最Top的前N名作为排行榜的数据,这即是一个TopN算法。常见的解决方案有三种:(1)直接使用List的Sort方法进行处理。(2)使用排序二叉树进行排序,然后取出前N名。(3)使用最大堆排序,然后取出前N名。 第一种方案的性能是最差的,后两种方案性能会原创 2009-05-23 11:51:00 · 1517 阅读 · 0 评论 -
如何突破.NET内存限制?
我们现在的一个.NET应用程序需要用到2G左右的内存,当我们将这个程序放到有4G内存的服务器上运行时,就会抛出OutOfMemory异常。 为了搞清楚抛出异常的原因,我写了个用于申请内存的测试程序,每次申请100M。运行这个测试程序,发现每次申请到1.2G时就会抛出OutOfMemory异常。 我在网上找到了一篇文章,告诉如何突破1.2G内存:http:原创 2009-01-05 10:51:00 · 2452 阅读 · 0 评论 -
Spring.net 的一个bug ?
我在项目中都使用Spring.net作为IOC容器,今天有遇到了以前曾经出现的一个奇怪的bug,描述如下。 我配置了GameRoomConfig对象: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> objec原创 2008-12-08 11:52:00 · 772 阅读 · 0 评论 -
Remoting方法重载遇到的一个问题
在通过Remoting调用重载的泛型方法时,遇到了一个奇怪的问题,现使用一个例子一步步来说明如下。一.没有重载的情况 假设Remoting的接口是IComputer:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--原创 2008-11-28 10:52:00 · 819 阅读 · 0 评论 -
锁定与并发
在多线程程序中,我们经常需要对要访问的资源进行加锁。加锁的目的是为了同步对资源的访问,但是,加锁不可避免的会降低应用的并发量。那么如何在需要加锁的时候,尽可能地提高并发量了?下面是我的一些经验,仅供参考。 1.首先,我们要控制好锁的粒度。 锁的粒度越大,能支持的并发就越小。 我们只需要将真正需要同步的代码块lock住,而不需要同步的代码块不要放在lo原创 2008-11-26 09:52:00 · 830 阅读 · 0 评论 -
Spring.net -- 目前不支持getter、setter的访问限定符
如果你使用Spring.net作为你的IOC容器,那么一定要注意这个问题--Spring.net 目前不支持getter、setter的访问限定符。 我们通常使用setter属性来进行依赖注入,如: public class A { #region B private B b; public B原创 2008-05-29 18:53:00 · 774 阅读 · 0 评论 -
你知道 typeof(void) 吗?
void 也是.NET中的一种类型,只不过在C#中看不到“System.VOid”这种Type,而在IL这一层是可以看到的。 如果我们要通过反射判断一个方法是否有返回值,比较直观的解决办法好像是这样: MethodInfo originMethod = ;if (originMethod.ReturnType != null){ //}原创 2008-05-21 10:53:00 · 1172 阅读 · 0 评论 -
【C#2.0】发挥匿名委托的威力!
这几天研究了一下Linq,C# 3.0中的“扩展方法”特性为IEnumerable增加了诸如Where、Select等查询方法,这使得“语言集成查询”成为顺其自然的事情。而C#3.0中Linq的实现也是建立在C#2.0的匿名委托的特性之上。 今天,我尝试在C#2.0中使用匿名委托模拟C#3.0中Where、Select等查询方法的实现。我将所有的查询方法作为静态方法在Gener原创 2007-08-04 20:53:00 · 976 阅读 · 0 评论