当前位置: 首页 > 编程语言 > C#

将数据从非托管代码(C)传递到托管代码(C#)分享

时间:2023-04-10 11:11:57 C#

将数据从非托管代码(C)传递到托管代码(C#)我有一个用C#程序编写的应用程序,并使用一个DLL编写在C中。通过一些委托(函数指针),我设法调用了C函数。该函数预计会对某些数据进行大量处理,然后将处理后的二进制数据连同数据大小一起返回给C#代码。托管c#函数的原型为:privateunsafedelegatevoidMyCallback(IntPtrcs_buf,Int32cs_size);我从我的C代码中调用它:void*c_buf=NULL;intc_size=0;....这里进行一些处理来填充buf和size......MyCallback(c_buf,c_size);在托管C#代码中,我需要使用原型调用MyCallback函数:voidfoo(byte[]cs_buf,intcs_size)现在cs_size值没有问题,但是从C代码使用/传递二进制缓冲区的正确方法是什么到C#代码,以便它可以用作C#代码中的byte[]。如果我正在做的是正确的方法,那么将接收到的IntPtrcs_buf转换为byte[]的推荐方法应该是什么?谢谢,Vikram您应该使用Marshal.CopyMarshal.Copy方法(IntPtr,Byte[],Int32,Int32)将数据从非托管内存指针复制到托管8位无符号整数数组。假设cs_size是以字节为单位的大小:vararray=newbyte[cs_size];Marshal.Copy(指针,数组,0,cs_size);foo(数组,cs_size);顺便说一句,在这种情况下,foo()不需要采用cs_size参数,因为它可以使用数组的cs_size属性。此外,当C#代码复制数组时,您可以在调用回调后立即从C代码中free()缓冲区。否则,您需要从C导出mylib_free()方法,或在Windows下使用已知的内存分配器(不是malloc),例如LocalAlloc(来自C)和Marshal.FreeHGlobal(来自C#)。这就是Microsoft制作C++/CLI(也称为托管C++)的原因。你可以这样写一个函数:voidcall_foo(array^bytes){pin_ptrptrBuffer=&bytes[bytes->GetLowerBound(0)];foo(ptrBuffer,bytes->Length);这将采用C#字节数组,固定其内存,然后将其作为C样式字节数组传递给foo及其长度。无需清理或释放任何东西。固定指针在call_foo结束时超出范围时将自动取消固定。干净简单。以上就是C#学习教程的全部内容:将数据从非托管代码(C)传递到托管代码(C#)。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: