【干货】”首个“ .NET Core 验证码组件

前言

 

  众所周知,Dotnet Core目前没有图形API,以前的System.Drawing程序集并没有包含在Dotnet Core 1.0环境中。不过在dotnet core labs项目里可以见到MS已经在移植这个项目,不过目前的版本只能在Windows上和NET541+或DNX环境中才可以使用。

  不过在dotnetConf的第二天有一个叫做SkiaSharp的开源项目被提及;它是Google开源的跨平台2D图形API,Skia的.NET封装;目前只能在Full Framework上运行,不过它以后会支持Core。

 

现状

  据我了解,Dotnet Core目前没有可用的验证码组件可用,原因就是没有Core的图形接口。所以我的方案是通过开源的图形库来对dotnet core进行支持。

使用CImg开源库

  CImg 库是一个免费、开源的图像处理C++库,名称原意是 Cool Image,正如其名,CImg是一个非常优秀、功能强大、代码简洁、使用方便的C++ 图像处理库。它不仅非常适合科学家、研究生做科研时使用,也适合在工业应用工程开发中使用,更适合的是,对于有志于开发简洁、高效、功能强大的图像处理库的人而言,CImg的源码是不可多得的学习和参考资料。

  CImg 官网:http://cimg.sourceforge.net/

 

  可移植性:它完全兼容于操作系统如Windows, Unix, Linux, MacOS X, *BSD...,也完全兼容与编译器如 VC++, g++, icc...等,具有高度的可移植性。

 

  轻便性:CImg 非常轻便,整个库只用一个文件:cimg.h。任何C++应用程序只需要将该头文件包含进工程中即可使用该库的全部功能。它只定义了四了类(模板)和两个名称空间。该库只依赖与标准C++和STL,只在显示类部分依赖与操作系统的GDI,再也不依赖任何其他的外部库。

C++封装:

  我把绘图逻辑都放到了一个C++项目中,再用Core项目使用DllImport进行调用。

  而且想到跨平台在Win下我们使用Win32的DLL库进行编译,在Linux下使用g++直接对源代码进行链接编译; 

  下面是项目中最主要的CaptchaImage.cpp,Win32下它会被放到项目中

CaptchaImage.cpp

  头文件:

CaptchaImage.h

  这里为了跨平台编译我将stdafx.h文件进行了修改如下:

stdafx.h

Dotnet Core平台封装:

 

LibCaptchaImageWarp.cs

 

编译:

Win32编译就不用说了,直接在VS2015里编译就好,但是一定要注意的是,要编译为X64平台的目标代码,因为我们的Dotnet Core只支持x64平台;

主要说下Linux编译,目前我只在Ubuntu 14.04进行了编译测试,编译时CImg依赖也X11,所以要在编译环境中安装X11开发库,当然Ubuntu也需要64位;

sudo apt-get install libx11-dev

接下下是编译:

把那个Win32项目Copy到Linux中,然后Bash到目录下执行:

g++ CaptchaImage.cpp -fPIC -shared -o libcaptchaimage.so

然后当你发布程序时一定要将libcaptachaImageWarp.dll 和 Win32 Dll 或 libcaptchaimage.so 文件一起放到程序执行目录。

最后:

看看效果吧:

验证码源码:https://github.com/maxzhang1985/YOYOFx/tree/master/Native

Demo:https://github.com/maxzhang1985/YOYOFx/tree/master/CoreHost

QQ群:214741894

Demo和源码在:https://github.com/maxzhang1985/YOYOFx

YOYOFx是一个基于Core和Owin的框架,项目没有依赖微软的MVC框架,支持在.net 4.5和Mono上直接SelfHost或使用Tinyfox跨平台运行, 也支持在Dotnet Core 1.0 RC2 实现跨平台运行; 框架刚刚写出来还没有文档,请大家见谅。

欢迎大家Star和Fork

原文地址:http://www.cnblogs.com/maxzhang1985/p/5584528.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 招聘要求_Java程序员如何进阶,一般招聘都有哪些要求?

作为当前市场上应用领域最广、人才需求最大的编程语言,Java一直是人们入行IT行业的选择。然而,随着大批量的人涌入Java开发行业,企业的招聘门槛也在无形中抬高,提升专业技能成为新手Java程序员实现升职加薪的有效途径。分析各大招…

朝花夕拾——Java的synthetic修饰词

转载自 朝花夕拾——Java的synthetic修饰词Ok,目前为止,我还只是Android coder,一切对其他的学习都是以Android 为主线的支线任务。所以为什么会提到这个方法呢?是来自于google官方的性能建议文档的这样一句话:Consid…

asp.net MVC 应用程序的生命周期

首先我们知道http是一种无状态的请求,他的生命周期就是发出请求开始,到得到响应结束。那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序的生命周期和一个请求,从一个控件到另一个控…

java 刷新界面_利用java如何实现在删除信息后刷新页面功能

利用java如何实现在删除信息后刷新页面功能发布时间:2020-11-17 14:25:49来源:亿速云阅读:74作者:Leah这篇文章给大家介绍利用java如何实现在删除信息后刷新页面功能,内容非常详细,感兴趣的小伙伴们可以参考…

Java中的synthetic

转载自 Java中的synthetic 有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。 下面我给大家介绍一下synthetic 下面的例子…

java凯撒密码_JAVA凯撒密码 选择问题

以下是加密和解密的程序:加密:importjava.io.*;classJiami26{publicstaticvoidmain(Stringargs[])throwsIOException{charb[];//存放密文BufferedReaderbr2newBufferedReader(newIn...以下是加密和解密的程序:加密:import java.io…

synthetic Java合成类型

转载自 synthetic Java合成类型Synthetic看Class源码的时候,看到有个关键字Synthetic以及isSynthetic()方法,遂有兴趣查阅了一番。   一开始以为,就是复合类型(引用类型),也就是非基本类型,…

Java 反射机制深入研究

转载自 Java 反射机制深入研究Java反射机制深入研究Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否…

RAML用户应遵循的C#与Web API代码生成模式

在过去几年间,REST规范的各种语言正在逐渐流行起来,例如RAML、Swagger以及API Blueprint。但这些语言的主要范畴在于客户端工具,主要用于生成JavaScript或TypeScript文件、模拟对象(mock),以及对应的客户端…

wxpython使用folium_wxPython实现文本框基础组件

本文实例为大家分享了wxPython实现文本框的具体代码,供大家参考,具体内容如下#-*- coding:utf-8 -*-"""#############################################StaticText 参数说明 --即 labelparent: -- 父窗口部件。id:…

教你实践ASP.NET Core Authorization(免看文档教程)

准备 创建一个名为AuthorizationForoNetCore的(web)解决方案,选择Empty模板添加相关nuget包引用Microsoft.AspNetCore.Mvc(选择最新版本)编辑Startup.cs文件,添加mvcservice并进行默认路由配置 添加Controllers文件夹&…

Class类中的getEnclosingXX、getDeclaredXX

转载自 Class类中的getEnclosingXX、getDeclaredXX一、getEnclosingXX getEnclosingClass():该类是在那个类中定义的, 比如直接定义的内部类或匿名内部类 getEnclosingConstructor():该类是在哪个构造函数中定义的,比如构造方法中定义的匿名…

二级MYSQL的语法整理_MySQL语法整理

一、基本语句(大写的代表固定语句,小写的代表自己命名部分)1. 数据库部分增:CREATE DATABASE database_name;删:DROP DATEBASE database_name;用:USE database_name;2. 数据表部分增:CREATE TABLE table_name ( field1…

java反射的field.get(null)

转载自 java反射的field.get(null) 在java的反射中,通过字段获取对象,是通过 public Object get(Object obj) 字段不是静态字段的话,要传入反射类的对象.如果传null是会报 java.lang.NullPointerException 但是如果字段是静态字段的话,传入任何对象都是可以的,包括null 下面是…

JFlow CCFlow工作流引擎北京培训邀请函

各位jFlow, CCFlow 爱好者: 驰骋工作流程引擎是国内开源很成功的一款工作流程引擎,广泛应用于大型集团企业、机关事业单位、部队军区、保密军工行业。设计精巧、功能强大、极高的可配置性、概念名词通俗易懂、成长于中国生产制造、管理审批特有的环境下,…

java按列读取数据再存储_Java指定行读写数据

/*** 根据指定行写数据** param lineNumber 要存的行数* param data 要存储的数据*/public static void setAppointedLineNumber(int lineNumber, String data) throws IOException {Path path Paths.get(configuration);List lines Files.readAllLines(path, StandardCharse…

Java通过Class的对象来获取泛型的class示例

转载自 Java通过Class的对象来获取泛型的class示例 在使用spring的JdbcTemplate实现DAO的时候,经常会用到一个类ParameterizedBeanPropertyRowMapper。它的静态方法newInstance()接受一个Class类型的参数,用于将ResultSet中的属性映射到传入的这个Class…

微软觊觎LinkedIn算法

分析师说,LinkedIn算法的价值远超260亿美元买到的数据。 微软在昨天宣布了即将以262亿美元的价格收购企业社交网络LinkedIn。一名分析师称,这起并购由微软对算法的渴望而起。 “微软对LinkedIn的兴趣有两部分”,Gartner研究总监Jenny Sussin在…

阿卡姆疯人院需要java吗_蝙蝠侠阿甘疯人院 这个报错 怎么解决 哪位大神知道...

有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾。************** 异常文本 **************System.Runtime.InteropServices.SEHException: 外部组件发生异常。在 BmLauncherLib.PhysXSDK.{ctor}(PhysXSDK* )在 BmLauncherUtils.PhysXSDK..ctor(…

Java5泛型的用法,T.class的获取和为擦拭法站台

转载自 Java5泛型的用法,T.class的获取和为擦拭法站台Java 5的泛型语法已经有太多书讲了,这里不再打字贴书。GP一定有用,不然Java和C#不会约好了似的同时开始支持GP。但大家也清楚,GP和Ruby式的动态OO语言属于不同的意识形态&…