为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C#和内存指针

2018-09-04 2页 doc 28KB 2阅读

用户头像

is_881070

暂无简介

举报
C#和内存指针C#和内存指针 关 键 词: serverword.net 虽然到了.net 的runtime 时代,C 仍然是不可磨灭的主要支柱,包括在MSDN 里见到的API 大部都是有指针类型存在,那么在以C 冠首的C# 里应当如何去使用指针呢? 其实,C# 里可以直接使用结构型的变量引用进API,但是毕竟它不是指针在对一些涉及以结构数组存放的内存区操作可能就力有不及了,我举一个例子要使用到结构数组的一个API(对这个API 不必加以了解,我们不是主说API): net_api_status nets...
C#和内存指针
C#和内存指针 关 键 词: serverword.net 虽然到了.net 的runtime 时代,C 仍然是不可磨灭的主要支柱,包括在MSDN 里见到的API 大部都是有指针类型存在,那么在以C 冠首的C# 里应当如何去使用指针呢? 其实,C# 里可以直接使用结构型的变量引用进API,但是毕竟它不是指针在对一些涉及以结构数组存放的内存区操作可能就力有不及了,我举一个例子要使用到结构数组的一个API(对这个API 不必加以了解,我们不是主说API): net_api_status netshareenum( LPWSTR servername, DWORD level, LPBYTE* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle ); 及它要用到的结构 (设 level 为1): typedef struct _share_info_1 { LPWSTR shi1_netname; DWORD shi1_type; LPWSTR shi1_remark; } SHARE_INFO_1, *PSHARE_INFO_1, *LPSHARE_INFO_1; 在第三个参数 LPBYTE* bufptr 它就是一个指针,而非C 型传统语言的数组的做法,就可以直接声明成 ref SHARE_INFO_1[] bufptr,但我不推荐这么做,原因之一在C# 似乎还不支持结构数组块,而且它并没有存在数组型结构参数的重载。暂且不说如何去实现它,我希望以 C 的操作方式-指针去实现,所以我转成 C# 声明如下: [structlayout(layoutkind.sequential)] protected struct SHARE_INFO_1 { [MarshalAs(UnmanagedType.LPWStr)] public string shi1_netname; [MarshalAs(UnmanagedType.U4)] public uint shi1_type; [MarshalAs(UnmanagedType.LPWStr)] public string shi1_remark; } [dllimport("netapi32.dll", entrypoint="netshareenum")] protected static extern int NetShareEnum( [MarshalAs(UnmanagedType.LPWStr)] string servername, [MarshalAs(UnmanagedType.U4)] uint level, ref IntPtr bufptr, [MarshalAs(UnmanagedType.U4)] uint prefmaxlen, [MarshalAs(UnmanagedType.U4)] ref uint entriesread, [MarshalAs(UnmanagedType.U4)] ref uint totalentries, [MarshalAs(UnmanagedType.U4)] ref uint resume_handle ); 在上面的函数执行完成后,会在指针 bufptr 所指的位置存在一个数据块,此内存块的数据格式是以 share_info_1 结构排列的(假设level为1),并且在 entriesread 中指示该块的结构个数,那么我们要如何将它转成真正可用的类型到 share_info_1[] shareinfo; 变量中去呢,其实 c# 提供了一种 marshal.ptrtostructure 的,它就是专门将指针所指的非托管内存块搬到托管内存中的指定的结构中去,可它不支持结构数组(目前.net 1.1 还没有该重载实现过),所以只好也最好一个一个的搬(而且一个一个搬更形象些),例子如下: int32 ptr = bufptr.toint32(); for (int i=0; i说明
指针的用法,并不是主要说api 对该api 及它的参数不必细加研究
/
本文档为【C#和内存指针】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索