[原]C#与非托管——初体验

P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简单,不需要编写相应的C函数导出。例如

[DllImport(LIB, CallingConvention = CallingConvention.Cdecl)]

public static extern void testfunc();

简单的P/Invokes封装可以把C库头文件的函数全部复制过来,并按照如下规则进行修改(可以通过正则表达式查找替换搞定):

  1. C#的基元类型都可以在C里面找到对应的类型(decimal和object除外,size_t需要特别注意,要用IntPtr对应)
  2. 参数和返回值里面的字符串可以替换成string;
  3. 参数里面的char *或const char *等之类的内存块数据可以替换成byte[];
  4. 参数和返回值里面的函数指针可以先声明参数和返回值类型兼容的delegate,然后替换成delegate;
  5. 其他指针类型可以替换成IntPtr;
  6. ...不定长度参数的函数和va_list参数的函数没找到如何映射的,最终只能放弃导入自己用C#实现;
  7. 传递类/结构值而非指针的函数不知道如何声明,暂时没有这个需求。
时间: 2024-11-06 01:55:49

[原]C#与非托管——初体验的相关文章

[原]C#与非托管——封送和自动封送

之前说到了如何从C函数声明通过简单的查找替换生成一份C#的静态引用声明(C#与非托管--初体验),因为只是简单说明,所以全部采用的是基础类型匹配和自动封送.自动封送虽然能省去我们不少编码时间,但如果不理解自动封送背后的实际行为,那就如同看魔术师的黑盒子,知其然不知其所以然.而且,自动封送也不是永远有效的万能药,因此这里记录一下封送相关的理解. 非基础类型在C#与Native代码交互时需要进行封送处理,一般的封送处理方式有内存拷贝.固定内存地址,总结如下: 针对string,可以使用Marshal

[原]C#与非托管——动机

Unity3D采用C#作为脚本开发语言,本来是可以直接提供代码局部更新机制的,可惜Mono和Unity3D迫于苹果的压力,在iOS上采用AOT模式运行,断绝了代码局部更新的路(任何一个具有很高知名度的引擎都不敢明着违反苹果的条款),而Android的代码局部更新则被Unity3D做成了一个收费的售后服务项目.不过不是跨平台的机制都没有多大的意义,所以如果需要局部更新代码(大家也都称为热更新),一般都需要采用脚本的方式,把大部分游戏内逻辑特别是变化很大的逻辑写在脚本里面,然后把脚本作为资源来做局部

PHP初体验

PHP初体验 提笔写初体验总不知道从何说起,直接聊PHP中的函数.PHP网络技术.数据库操作.PHP模板等感觉又不是初体验.最后还是决定从PHP的面向对象.PHP的魔术方法.PHP的反射.PHP中的异常和错误这4个方面简单介绍一下. PHP面向对象的“形”与“本” 这里我们就不给面向对象下定义了,不过我们还是要说一下类和对象的.类是对象的抽象组织,对象是类的具体存在.接下来我们就拿PHP为例,来探讨一下对象的“形”与“本”的问题. 在PHP中,每个类的定义都是以关键字class开头,后面是类名和

Linux初体验(六)

Linux初体验(六) inode cp mv rm ln 时间戳(touch.stat) 环境: CentOS 6.8 inode 用途说明 索引节点,存放文件的元数据 一个索引节点就是一个表项,包含了文件的元数据信息,包括: - 文件类型,权限,UID, GID- 链接数(指向文件名路径名称的个数) - 文件的大小与时间戳- 指向磁盘上文件的数据块指针  - 有关文件的其他数据 inode 本质上是一种数据结构,包含了文件系统中各个文件的元数据:inode表就是一份包含了对应文件系统中的所有

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

1Python全栈之路系列之Django初体验

Python全栈之路系列之Django初体验 Django不得不说在Python中是一个非常强大的全栈框架,而且入门也比较简单,只要你学完了基本的Django知识,接着再做一两个项目,不大不小就成,然后你再去学其它的框架你会发现,在那些小而美的框架中,你学起来将非常的快,因为你在学习Django的时候就已经学习并且体验过了Web开发流程,所以会有这么一个现象出现,有些新手朋友在学习Flask.Tornado等小而美的框架时,很多概念不是很理解,比如ORM.路由等,但你学Django就不会出现这种

Xamarin.iOS开发初体验

Xamarin是一个跨平台开发框架,这一框架的特点是支持用C#开发IOS.Android.Windows Phone和Mac应用,这套框架底层是用Mono实现的. Mono是一款基于.NET框架的开源工程,包含C#语言编译器.CLR运行时和一组类库,能运行于Windows.Linux.Unix.Mac OS和Solaris.对于.NET程序员来说,Xamarin是走向安卓.iOS.Mac跨平台开发的神器,不仅能用熟悉的C#来开发,还能使用Visual Studio作为IDE.本文内容是Xamar

屌丝就爱尝鲜头——java8初体验

Java8已经推出,让我们看看他的魅力.让我们看看他改变较大的部分. 一.java8概述 Java8是由Oracle(甲骨文)公司与2014年3月27日正式推出的.Java8同时推出有3套语言系统,分别是Java SE8.Java SE Emebbled 8.Java ME8. Java SE8较以往的系统增强的功能有: ①增强了对集合式操作语言--lambda表达式的支持,"Lambda 表达式"(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演

bash编程初体验之for

bash编程初体验之for for while until 概述 本文将介绍以for为代表的循环语句在shell 脚本中的应用,常见的循环语句有for, while, until,作为循环语句,顾名思义,它就是重复地做一件事,直到满足某一条件而退出:另外,还有两个循环控制语句continue与break来配合循环语句,以实现临时中断或跳出循环的功能:以下为for, while, until的知识点提炼: for, while, until 进入条件          for: 列表元素非空