delegate

使用PInvoke互操作,让C#和C++愉快的交互优势互补

試著忘記壹切 提交于 2020-10-08 02:29:07
一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet = CharSet.Unicode)] [SecurityCritical] [SuppressUnmanagedCodeSecurity] private static extern bool InternalUseRandomizedHashing(); [DllImport("mscoree.dll", EntryPoint = "ND_RU1")] [SuppressUnmanagedCodeSecurity] [SecurityCritical] public static extern byte ReadByte([In] [MarshalAs(UnmanagedType.AsAny)] object ptr, int ofs); 联想到上一篇阿里短信netsdk也是全用C++实现,然后用C#做一层壳,两者相互打辅助彰显更强大的威力,还有很多做物联网的朋友对这种.Net互操作技术太熟悉不过了,很多硬件,视频设备驱动都是用C/C++实现,然后用winform/WPF去做管理界面,C++还是在大学里学过,好多年没接触了,为了练手这一篇用P/Invoke来将两者相互打通。 二

csharp: Emgu.CV.OCR and Tesseract.OCR Optical Character Recognition

邮差的信 提交于 2020-10-04 00:19:12
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Emgu.CV; //3.2.02 using Emgu.CV.VideoStab; using Emgu.CV.ML; using Emgu.CV.OCR; using Emgu.CV.Structure; //https://github.com/iobrains/OpenCV namespace CharacterRecognition { /// <summary> /// geovindu edit /// </summary> public partial class MainWnd : Form { string path; public MainWnd() { InitializeComponent(); } /// <summary> /// /// </summary> /// <param name="sender"><

csharp: using Acrobat.dll pdf convert images in winform

天大地大妈咪最大 提交于 2020-10-03 17:28:31
// A delegate type for hooking up change notifications. public delegate void ProgressChangingEventHandler(object sender, string e); /// <summary> /// Author:ESMAEEL ZENDEHDEL zendehdell@yahoo.com /// DATE: 88/11/17 /// Description: A Class For Exporting Image From PDF Files /// License : Free For All /// //Acrobat com /// </summary> class PDFConvertor { public int pageCount = 0; Acrobat.CAcroPDDoc pdfDoc = new Acrobat.AcroPDDoc(); Acrobat.CAcroPDPage pdfPage = null; Acrobat.CAcroRect pdfRect = new Acrobat.AcroRect(); Acrobat.AcroPoint pdfPoint =new Acrobat.AcroPoint(); public event

iOS开发面试BAT等公司的一点记录

≯℡__Kan透↙ 提交于 2020-10-03 13:21:58
算法 LeetCode easy 和 medium 类型的题目刷一遍,一般面试的题目不出意外基本在里面。 Leetcode 官方也有类似的一些专题比如练习模式 有精力的可以看一遍《剑指offer》这本电子书。结合 Leetcode ,理解其思维逻辑,不容易忘记,这一关问题就不大了 基础 大厂最看重的是基础,基础扎实,其他稍微有点瑕疵问题也不大. iOS基础 RunLoop 。 建议 RunLoop 源码通读一遍,这块内容经常被考查。结合该篇文章 深入理解RunLoop 肯定会加深你的理解. 内存。 MRC和ARC的区别。内存管理原理是什么。几个关键字的实现和不同点比如 strong , weak , assign , retain , copy , unsafe_unretained 。因为涉及到内存,所以会引申到堆栈这一块. Block 。 Block 的实质,在 MRC 和 ARC 中的差别, Copy 关键字,和函数指针的联系。 __block 关键字 Runtime 相关。 消息转发几个步骤,消息怎么发送? 多线程. GCD , Operation 。一般会给你一个场景,问你怎么处理。还有就是线程安全这一块 锁。这块经常和多线程一起进行考察 KVO 原理 属性,协议,分类,扩展 Delegate , Block , Notification 网络 http1.1 、

mybatis源码

一个人想着一个人 提交于 2020-10-03 08:43:53
1. 若要查询本次查询的sql,怎么弄? --》往下走:该prepareStatement中就可以看到sql 3.RoutingStatementHandler 路由Statement,该方法在prepare之前执行 public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { switch(ms.getStatementType()) { case STATEMENT: this.delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case PREPARED: this.delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case CALLABLE: this.delegate = new

今日头条iOS高级工程师面试总结

穿精又带淫゛_ 提交于 2020-10-02 19:13:17
面试形式:电话面试 作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的 iOS交流群 :761407670 进群密码‘博客’,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长! 1. 你平时怎么解决网络请求的依赖关系:当一个接口的请求需要依赖于另一个网络请求的结果 解析: 办法1:线程:NSOperation 操作依赖和优先级 [ operationB addDependency:operationA]; // 操作B依赖于操作 办法2:逻辑:在上一个网络请求的响应回调中进行下一网络请求的激活 关于RAC你有怎样运用到解决不同API依赖关系 信号的依赖 使用场景是当信号A执行完才会执行信号B,和请求的依赖很类似,例如请求A请求完毕才执行请求B,我们需要注意信号A必须要执行发送完成信号,否则信号B无法执行 //这相当于网络请求中的依赖,必须先执行完信号A才会执行信号B //经常用作一个请求执行完毕后,才会执行另一个请求 //注意信号A必须要执行发送完成信号,否则信号B无法执行 RACSignal * concatSignal = [ self.signalA concat: self.signalB] //这里我们是对这个拼接信号进行订阅 [concatSignal subscribeNext:^( id x) {

Spring Retry框架——看这篇就够了

自作多情 提交于 2020-09-30 02:44:31
简介 软件架构从当初的单机,演变到后来的集群,再到后来的分布式应用。原本看似可以信任的服务调用,加上了网络因素就变得不再可靠。再考虑到一些调用链路的特殊性,又要保证性能,又要尽可能增加成功率,所以调用方必须肩负起重试的责任。 自己写,怎样实现? 重试并不复杂,首先来分析下重试的调用场景,可以想到业务当中不止一处会需要重试能力,并且业务其实更关乎自己的代码块被重试就可以了,而不在乎如何实现的重试。 所以变化的是一段可以重复执行的代码块,以及重试次数等。 ① 代码块可以用Java8支持的函数式编程解决 ② 次数可以用入参/配置实现 首先定义一个执行的模版,结合上面我们的分析,这个模版需要一个待实行的 方法块 ,以及 配置。 (次数等区分场景,用枚举定义,方便全局管控): @AllArgsConstructor @Getter public enum RetrySceneEnums { QUERY_USER_INFO("查询用户信息", 2), ; private String desc; private int retryTimes; } abstract class MyRetryTemplate<Req, Resp> { /** 配置 */ private IntegrationRetryEnums retryEnum; /** 方法块 */ private Function

我将如何运行异步任务 <T> 方法同步?

空扰寡人 提交于 2020-08-20 08:51:38
问题: I'm learning about async/await, and ran into a situation where I need to call an async method synchronously. 我正在学习异步/等待,并遇到需要同步调用异步方法的情况。 How can I do that? 我怎样才能做到这一点? Async method: 异步方法: public async Task<Customers> GetCustomers() { return await Service.GetCustomersAsync(); } Normal usage: 正常用法: public async void GetCustomers() { customerList = await GetCustomers(); } I've tried using the following: 我尝试使用以下方法: Task<Customer> task = GetCustomers(); task.Wait() Task<Customer> task = GetCustomers(); task.RunSynchronously(); Task<Customer> task = GetCustomers(); while(task.Status !=

大白话说Java反射:入门、使用、原理

◇◆丶佛笑我妖孽 提交于 2020-08-20 06:56:27
文章首发于 【博客园-陈树义】 ,点击跳转到原文 《大白话说Java反射:入门、进阶、原理》 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 Apple apple = new Apple(); //直接初始化,「正射」 apple.setPrice(4); 上面这样子进行类对象的初始化,我们可以理解为「正」。 而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。 这时候,我们使用 JDK 提供的反射 API 进行反射调用: Class clz = Class.forName("com.chenshuyi.reflect.Apple"); Method method = clz.getMethod("setPrice", int.class); Constructor constructor = clz.getConstructor(); Object object = constructor.newInstance(); method.invoke(object, 4); 上面两段代码的执行结果,其实是完全一样的。但是其思路完全不一样,第一段代码在未运行时就已经确定了要运行的类(Apple)

c#多线程总结(纯干货)

我们两清 提交于 2020-08-19 00:49:01
线程基础 创建线程 static void Main( string [] args) { Thread t = new Thread(PrintNumbers); t.Start(); // 线程开始执行 PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine( " Starting... " ); for ( int i = 1 ; i < 10 ; i++ ) { Console.WriteLine(i); } } View Code 暂停线程 class Program { static void Main( string [] args) { Thread t = new Thread(PrintNumbersWithDelay); t.Start(); PrintNumbers(); Console.ReadKey(); } static void PrintNumbers() { Console.WriteLine( " Starting... " ); for ( int i = 1 ; i < 10 ; i++ ) { Console.WriteLine(i); } } static void PrintNumbersWithDelay() {