在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档
    
            
摘要:一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎。可是,目前并没有可以在 .NET 框架上运行的免费 PDF 渲染引擎。经过网上的搜索,有人使用 C++/CLI 调用 XPDF 或 Mupdf,实现了不安装 Adobe 系列软件而渲染出 PDF 文件的功能。Mupdf 是一个开源的 PDF 渲染引擎,使用 C 语言编写,可编译成能让 C# 调用的动态链接库。因此,只要编写合适的调用代码,就能使用该渲染引擎,将 PDF 文档转换为一页一页的图片,或者在程序界面显示 PDF 文档的内容。要使用 Mupdf 渲染 PDF 文档,有几个步骤:获取 Mupdf 的动态链接库。了解该库中的相关
        
阅读全文
摘要:.NET门槛低?——没文化真可怕作者:Tony Qu 今天又看到某首页博文里出现了“.NET门槛低”的字眼,我真有点想抽这位博主,你这么多年.NET大概白学了!白用了!我建议你赶紧转java阵营吧,.NET不适合你,真的!如果你不改变这个观念,请你以后出去别说自己是.NET程序员!这位博主的观点很有意思,用.NET就不用懂算法、不用懂数据结构,不用懂很多东西,那我只能说你可能业务系统做多了,还是很初级的业务系统,如果这么多年你连一个.net算法都没写过,一个数据结构都没写过,真的很难想象你是怎么过来的?!就算初级系统,数据结构你总接触过吧。我来给你举几个很实际的例子,排程系统中你能用现有.NE
        
阅读全文
摘要:随笔- 80 文章- 1 评论- 925.NET深入解析LINQ框架(二:LINQ优雅的前奏)3】.LINQ框架的主要设计模型到了这里我们似乎隐隐约约的能看见LINQ的原理,它不是空中花园,它是有基础的。在上面的一系列新特性的支持下,微软通过大面积的构建扩展方法使得上述特性能连贯的互相作用,形成自然的集成查询框架。上面的这些特性都属于语言为了LINQ而做的增强,也可以说是设计者们在不断的探索新的比较符合现代开发体系的语言特性,也越来越多的支持函数式的编程特性,比如DLR的引入对Python、Ruby函数式脚本语言的强大支持,后面也会越来越多的支持其他的函数式脚本语言。下面我们将主要学习对象模型
        
阅读全文
摘要:.NET平台初窥 在C#语言和.NET平台之前,针对Windows家族的软件开发主要使用COM,也就是基于组建模型的开发,例如C++程序员可以创建一个COM类库供VB程序员使用。COM的跨语言特性虽然有用,但是他开发复杂和脆弱,且只能针对Windows家族的操作系统。虽然很多的应用程序使用了COM获得了成功,但是如今的操作系统应用程序,web网站,操作系统服务和各种可重用的类库都是通过使用.NET平台进行开发。 C#和.NET平台在2002年第一次推出,提供了一种更加有利的,灵活的和简单的开发模型。.NET平台是一种可以在Windows家族和其他操作系统如Mac OS X和Unix/Lin..
        
阅读全文
摘要:用了多年的Visual Studio,今天才发现这个编码技巧,真是惭愧,分享出来,算是抛砖引玉吧!开发环境: vs2010+C#1、代码重构新建类如果你还像我以前一样使用右键快捷菜单新建类,那就太Out了。VS的那个“新建项对话框”出来的很慢,很影响心情。当你发现需要定义一个类时,正确的方法:1)在当前代码处定义上类名,例如:List<NewClass> ls;2)焦点移动到NewClass处,按下ctrl + .("点")3)回车。这样类就建好了。此方法还适用于类的方法、属性、字段,重命名字段方法名等2、提取方法有时我们发现自己老是在写同一段代码,可以提取一个
        
阅读全文
摘要:国庆去了一趟北京,回来一直忙着各种各样的事情,有公司的,有个人的,就没停过来,所以很久没有写博客了,写博客要有一个好的心情及一个好的思路,否则宁愿不写,这是我的准则。虽然这段时间没有写博客分享各种经验,不过一直还在做一些框架相关的事情,很多东西沉淀下来,慢慢有空就继续分享,与大家做一些探讨研究了。Winform开发框架方面的文章我介绍很多了,有宏观介绍,也有部分技术细节的交流,每次我希望能从不同角度,不同方面来介绍我的WInform开发框架,这些其实都是来源于客户的需求,真实的项目场景。本文主要介绍Winform开发框架的各种演化,适合在各种系统应用场景下的使用过程。Winform开发框架,从
        
阅读全文
摘要:我们公司有个测试人员给我提了一个有趣的bug,有一个快捷键ctrl+1,但是他用了另一种方法触发了它.他在一个textBox里面随便输入了一串文本,然后选中这串文本后按下"1",神奇的事情发生了,竟然触发到了ctrl+1的快捷键(在我的程序里ctrl+1是换屏,就是瞬间换到了1屏).作为一个程序员大家可能都能猜到原因,需要的就是测试~!新建了一个wpf程序注册键盘按下事件public MainWindow() { InitializeComponent(); this.KeyDown += new KeyEventHandler(Mai...
        
阅读全文
摘要:秋天新作品:秋式广告杀手,每年帮大伙多活7-8天!搜索引擎:自从google在国内落幕之后,搜索就转向百度了,然而百度的广告越来越多,有时候整页都是,虽然烦,却没办法,强制的啊!视频网站:在国内,基本看视频来来回回,就优酷或土豆了(当然偶尔没有时,也会转其它网站):不过看视频,也是越来越过分了,你网页前前后后上上下下几十个广告还不够,还要发展到强制性随机看广告,再发展强制性必看广告,再最后还强制性中间也偶尔插广告,下一步就强制性中间也必播广告了。反抗的声音?用户这么一次一次的被强奸,为啥国内的法律就不能消灭这种强制呢?民间就没有组织起诉一下呢?大伙习惯性的被强奸,却无力反抗!无法反抗,就享受?
        
阅读全文
摘要:通常我们通过代码混淆、加密的形式达到软件保护的目的。在Web开发里我们接触过的可能就是JS代码加密了,可以通过对JS代码进行混淆、加密从而实现对核心JS代码的保护。如果没有接触过的可以在这里简单了解一下,这次我们就不去细说了。在以前Win32的软件中,加壳脱壳的技术已经发展的非常成熟,国内有大名鼎鼎的看雪、吾爱破解等论坛,三四年前还在上学时,论坛里的大牛一直都是自己的偶像。而.NET程序因为编译结果不是机器代码语言,而是IL语言,所以加壳脱壳相关的软件还不是很多,我搜索到了一些,如VS自带的DotFuscator、.NET Reactor、xeoncode等,这次我们就简单介绍下手边有的.NE
        
阅读全文
摘要:介绍在使用多线程模型进行编程时,经常遇到的问题之一是,当我们关闭前台的UI线程时,后台的辅助线程仍然处于活动状态,从而导致整个应用程序无法正常退出。这时我们需要一种较安全的方式来结束后台线程的运行,这样我们可以随时结束后台线程的运行,并且在线程结束时进行相应的资源清理工作(例如将内存数据写入硬盘)。.net框架提供了一些工具来实现该功能。目录IsBackground属性Abort方法轮循方式取消阻塞的线程IsBackgound属性Thread类提供了IsBackground属性,当线程的IsBackground属性被设置为true时,表示此线程为后台工作线程。当一个应用程序结束时,它的所有后台
        
阅读全文
摘要:深入理解《正则表达式》(视频)会用“正则表达式”还不够,真正理解“正则表达式”才能游刃有余。本套视频的目的是,让你理解它,从而可以写出超级强大的表达式!byKev++深入理解《正则表达式》01介绍深入理解《正则表达式》02基础深入理解《正则表达式》03字符类深入理解《正则表达式》04数量修饰符深入理解《正则表达式》05边界符深入理解《正则表达式》06分组深入理解《正则表达式》07断言深入理解《正则表达式》08实战 数字深入理解《正则表达式》09条件语句深入理解《正则表达式》10贪婪与懒惰深入理解《正则表达式》11实战 python深入理解《正则表达式》12再见标签:regex
        
阅读全文
摘要:这节,我们说一说,图的基本源代码的源代码实现。具体情况,请听我一一给大家娓娓道来。图的基本操作用一个接口来表示,为表示图的基本操作,同时给出了顶点类的实现。由于顶点只保存自身信息,所以顶点类 Node<T>很简单,里面只有一个字段 data。顶点的类 Node<T>的实现如下所示。public Class Node<T>{private T data; //数据域//构造器public Node(T v){data = v;}//数据域属性public T Data{get{return data;}set{data = value;}}结构如图所示:}图的
        
阅读全文
摘要:1:通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍2:通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法本节内容:1:简述组件设计的过程及思路及部分重点源码讲解2:源码下载3:扩展机制说明附源码截图:等会看以下思路时,可以对照着看:一:简述组件设计的过程及思路1:为什么想到弄成组件?当重复的代码或相似的事件>=2个时,我都会想一下,是否还可能有第3个,第4个相近的,如果有,就会统一处理,组件就是设计的再通用一些。2:本人设计组件的原则?2.1:让用户以最简单的方式使用或调用组件,编写代码量最小化;2.2:所有的设计,都参考第2.1点。3:本人组件
        
阅读全文
摘要:这篇文章,我们来讨论图的相关知识。一、究竟什么图装结构了,所谓的图是图状结构简称图,是另一种非线性结构,它比树形结构更复杂。树形结构中的结点是一对多的关系,结点间具有明显的层次和分支关系。每一层的结点可以和下一层的多个结点相关,但只能和上一层的一个结点相关。而图中的顶点(把图中的数据元素称为顶点)是多对多的关系,即顶点间的关系是任意的,图中任意两个顶点之间都可能相关。也就是说,图的顶点之间无明显的层次关系,这种关系在现实世界中大量存在。因此,图的应用相当广泛,在自然科学、社会科学和人文科学等许多领域都有着非常广泛的应用。例如搜索引擎,地图等等。如图所示:图(Graph)是由非空的顶点(Vert
        
阅读全文
摘要:一般情况下,一个类都会有多个构造函数。随着时间的推移,成员变量、构造函数不断增加。为了处理这种情况最方便的办法就是:在声明变量的时候进行初始化,而不是在每个构造函数中进行。无论是类成员(静态变量)合适实例变量,我们都应该充分利用初始化器的语法。 C#编程在,一般在声明一个变量的同时我们会对其进行初始化:1 class Employee2 {3 private List<Employee> empList = new List<Employee>();4 }不论我们为Employee类添加了多少个构造函数,empList变量都能够被正确的初始化,这是因为...
        
阅读全文
摘要:今天无聊突发奇想做个贪吃蛇,虽然网上很多这东西了,不过自己写的感觉还行吧贪吃蛇分析游戏规则:1、蛇起始长度5,每吃一个食物增加1,最大15过关2、蛇用蓝色表示,食物用绿色,障碍物用黑色3、当蛇碰到自己、墙壁、障碍物则游戏失败4、方向键控制蛇的移动方向,蛇不可反方向移动,如正在向上移动,不能马上向下,只能向左、右、上运动5、每过关一次速度提升一次大概思路:1、地图用网格的形式表示,蛇由方格组成,保存在list中2、1中提到了方格,方格保存的内容有,颜色,坐标,是否可以通过,是否是食物3、向前移动一次,将前面方格添加进蛇列表中,将列表最后一个移除,若为前方格子为食物,则不移除最后一个4、使用whi
        
阅读全文
摘要:第一篇我们做了一个简单的页面广度优先来抓取url,很显然缺点有很多,第一:数据结构都是基于内存的,第二:单线程抓取速度太慢,在实际开发中肯定不会这么做的,起码得要有序列化到硬盘的机制,对于整个爬虫架构来说,构建好爬虫队列相当重要。 先上一幅我自己构思的架构图,不是很完善,算是一个雏形吧。一:TODO队列和Visited集合 在众多的nosql数据库中,mongodb还是很不错的,这里也就选择它了,做集群,做分片轻而易举。二:中央处理器 群架,斗殴都是有带头的,那中央处理器就可以干这样的事情,它的任务很简单, 第一: 启动时,根据我们定义好的规则将种子页面分发到各个执行服务器。 第二:...
        
阅读全文
摘要:我在发表了《Delegate如何进行类型转换?》之后又想到了其他一些相关的东西,除了简单地分析如何通过Emit实现EventHandler的类型转换之外,还加上关于Delegate“协变”与“逆变”的一些东西,算是对前一篇文章的完善。目录一、从Delegate的“协变”与“逆变”说起二、EventHandler<TEventArgs>是否换一种定义方式更好?三、“统一的事件注册”能否应用于一般形式?四、通过Emit实现EventHandler的类型转换一、从Delegate的“协变”与“逆变”说起根据Delegate“协变”与“逆变”的原理,对于两个具有相同声明的两个Delegat
        
阅读全文
摘要:我们知道对于两个不具有继承关系的两个类型,如果没有为它们定义转换器,两这之间的类型转换是不允许的,Delegate也是如此。但是有时候我们却希望“兼容”的两种Delegate类型能够进行转换,比较典型的就是表示事件的Delegate。.NET Framework为我们定义了类型EventHandler来表示事件,但是却没有规定事件的Delegate类型是EventHandler的子类。原则上讲,事件可以是任意类型的Delegate,但是我们使用的事件一般具有如下两个共同点:不具有返回类型,或者返回类型为void;有且只有两个输入参数,其一个参数类型为Object,第二个类型是EventArgs
        
阅读全文
摘要:前段时间做一个产品,盈利方式也就是卖数据给用户,用wpf包装一下,当然数据提供方是由公司定向爬虫采集的,虽然在实际工作中没有接触这一块,不过私下可以玩一玩,研究研究。 既然要抓取网页的内容,肯定我们会有一个startUrl,通过这个startUrl就可以用广度优先的方式遍历整个站点,就如我们学习数据结构中图的遍历一样。既然有“请求网页”和“解析网页”两部分,在代码实现上,我们得需要有两个集合,分别是Todo和Visited集合,为了简单起见,我们从单机版爬虫说起,说起爬虫,就必然逃避不了海量数据,既然是海量数据,那么性能问题不容忽视,在Todo和Visited集合的甄别上,我们选择用Queu.
        
阅读全文