.Net CF C#熟悉

本文详细介绍了如何使用C#对WIFI API进行封装,包括处理非托管内存的方法及注意事项,如使用Marshal进行数据交换的过程,以及结构体和数组在C#与非托管代码间传递的具体操作。
花了一下午的时间对C# CF的WIFI API进行了封装。 回答问题网由于涉及到的数据结构中包含字符数组,需要使用C#的Marshal对该结构进行封装。
在这个过程中,涉及到了几个知识点;1、托管内存和非托管内存;
托管内存可认为是与非托管无关的内存,而非托管内存则是在托管代码中分配,给非托管代码使用的内存。
无论是托管内存还是非托管内存,都是在托管代码中分配和释放的。所谓的给非托管代码使用,无非就是分配一个缓冲区,用于传递数据而已。在垃圾回收机制中,对非托管内存的处理上存在的差异,使得C#不断地提示这是非托管内存,引起重视。2、对非托管内存的使用;
分配,使用,释放,三部曲。3、Marshal的本质
托管代码与非托管代码的数据交换,需要注重格式。C#不会在这个交换环节做任何的处理,正如Java中的JNI一样。它只是在不断地提醒,要数据交换了,要注意了。
简单的类型,值类型、字符串类型、基本的结构体、数组,C#直接就OK了。
复杂的类型,就需要通过缓冲区的形式传递。传递的就是缓冲区的指针。
这种情况下,就要注意内存上数据的位置是否一致。托管代码和非托管代码是不是有一致的理解。
C#于是提供了Marshal做了一个封装,这个封装的本质很简单,就是在指定的位置放入指定的数据;
而Marshal的存在,一方面是方便,一方面是提醒要小心。4、结构体数组
要区分结构体数组和对象数组;5、结构的使用
例如:
STRUCTA[] salist;
STRUCT item = salist[0];
对item的修改跟salist没有任何关系。第二条语句是赋值表达式,而不是获取结构体数组的一项的地址。
因为结构体是值类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值