C#与C/C++的互操作

C#可以调用C的导出函数,使用DllImportAttribute定义一个静态方法来调用C的导出函数,需要注意的是参数的传递,不同的参数类型传递方法有很大的差异。详细可以参见http://blog.csdn.net/Mittermeyer/archive/2007/04/27/1586867.aspx

主要是使用Marshal类进行内存跟C#之间的转换的操作

实际上C#的参数传递到C时,值类型就是直接传递值,指针的传递有时需要使用ref,这里不清楚运行时是否有再申请一块非托管内存来保存托管代码传过来的值。

基本类型数组的传递会变为数组首地址指针的传递,应该是运行时申请了一块非托管内存来保存数组的值,再将这块内存的首地址传给C函数。

如前面链接的网页描述的结构数组的传递,就是这样,如果要把数组的值传过去,则需要在申请内存后使用Marshal的StructureToPtr方法把托管内存里的数组值写到非托管内存中,在非托管内存中修改这些值之后,使用Marshal的PtrToStructure方法把非托管内存里的值复制到托管内存中。

自定义类,按照上面处理结构数组的方法思路也可以处理自定义类,只是类似StructureToPtr和PtrToStructure的值的复制操作需要自己实现。

委托的传递是使用hunk技术来实现的。这样可以实现C回调C#方法。

转载于:https://www.cnblogs.com/tendzzss/archive/2011/01/14/1935446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值