注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C#调用C++DLL小总结4  

2013-04-22 20:29:27|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#调用C++DLL小总结4

在前面的总结过程中,基本把一些常见的调用方式都总结了,但是还是有些需要不断的在使用的过程中进行丰富.今天就再总结一部分.

就是当C++DLL返回一个int *或者类似的东西怎么办?或者说返回一个数组,其实和前面的还是一样,这个其实当初想歪了,所以走了点儿弯路,其实非常简单:

Marshal.Copy

这个函数提供了十六个重载:

名称

说明

Marshal.Copy (Byte[], Int32, IntPtr, Int32)

将一维的托管 8 位无符号整数数组中的数据复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (Char[], Int32, IntPtr, Int32)

将数据从一维的托管字符数组复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (Double[], Int32, IntPtr, Int32)

将数据从一维的托管双精度浮点数组复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (Int16[], Int32, IntPtr, Int32)

将一维的托管 16 位有符号整数数组中的数据复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (Int32[], Int32, IntPtr, Int32)

将数据从一维的托管 32 位有符号整数数组复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (Int64[], Int32, IntPtr, Int32)

将一维的托管 64 位有符号整数数组中的数据复制到非托管内存指针。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Byte[], Int32, Int32)

将数据从非托管内存指针复制到托管 8 位无符号整数数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Char[], Int32, Int32)

将数据从非托管内存指针复制到托管字符数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Double[], Int32, Int32)

将数据从非托管内存指针复制到托管双精度浮点数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Int16[], Int32, Int32)

将非托管内存指针中的数据复制到托管 16 位有符号整数数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Int32[], Int32, Int32)

将非托管内存指针中的数据复制到托管 32 位有符号整数数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, Int64[], Int32, Int32)

将非托管内存指针中的数据复制到托管 64 位有符号整数数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr, IntPtr[], Int32, Int32)

将数据从非托管内存指针复制到托管 IntPtr 数组。

Marshal.Copy (IntPtr, Single[], Int32, Int32)

将数据从非托管内存指针复制到托管单精度浮点数组。

.NET Compact Framework 支持。

Marshal.Copy (IntPtr[], Int32, IntPtr, Int32)

将数据从一维托管 IntPtr 数组复制到非托管内存指针。

Marshal.Copy (Single[], Int32, IntPtr, Int32)

将数据从一维的托管单精度浮点数组复制到非托管内存指针。

.NET Compact Framework 支持。

这是从MSDN上拷来的,大家一看便发现了吧。

另外还有一个顺道要说的问题,就是指针数组的问题(如果有谁不明白啥叫这玩意儿,去看书吧),这个一定是对应的IntPtr

其实还有一种需求,就是在C#中对IntPtr进行内存空间的操作:

public IntPtr PointArrayToIntPtr(Point[] points)

        {

            if (points == null || points.Length == 0)

                return IntPtr.Zero;

            int size = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Point));

            IntPtr lpoints = System.Runtime.InteropServices.Marshal.AllocHGlobal(size * points.Length);

            IntPtr tmp = lpoints;

            for (int i = 0; i < points.Length; i++, tmp += size)

            {

                System.Runtime.InteropServices.Marshal.StructureToPtr(points[i], tmp, false);

            }

            return lpoints;

        }

 

     Point[] point = new Point[10];

            GCHandle handle = GCHandle.Alloc(point, GCHandleType.Pinned);

            IntPtr ptr = handle.AddrOfPinnedObject();

            //......

 

            handle.Free();

}

记着在不用的时候  Marshal.FreeHGlobal( lpoints  );//释放内存

但是,建议大家还是尽可能避开这种操作,毕竟内存管理还是有风险的,除非始终是你一个人管理着这些代码,否则,后果就不可预知了。

 

书到用时方恨少,事非经过不知难。努力!!!

  评论这张
 
阅读(945)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017