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

从非托管代码中传递指针分享

时间:2023-04-11 02:49:36 C#

从非托管代码中传递指针我有一个C#项目导入了一个Cdll,dll有这个函数:intprimary_read_serial(inthandle,int*return_code,int*serial,整数长度);我想访问串行参数。我实际上已经得到它来返回串行参数的一个字符,但我不确定我在做什么,并且想了解发生了什么,当然要让它工作。所以,我很确定正在访问dll,其他没有指针的函数也能正常工作。我应该如何处理指针?我必须元帅吗?也许我必须有一个固定的地方来放置数据?一个解释会很好。谢谢!Richard您必须使用IntPtr和Marshal将IntPtr转换为您想要放入其中的任何C#结构。在您的情况下,您必须将其编组为int[]。这是通过几个步骤完成的:这段代码应该给你一个想法://导入声明[DllImport("Library.dll")]publicstaticexternintprimary_read_serial(int,refint,IntPtr,int);//分配非托管缓冲区IntPtrserial_ptr=Marshal.AllocHGlobal(length*sizeof(int));try{//调用非托管函数intreturn_code;intresult=primary_read_serial(handle,refreturn_code,serial_ptr,length);//安全编组非托管byte[]byte[]bytes=newbyte[length*sizeof(int)];元帅。复制(serial_ptr,字节,0,长度);//转换为int[]int[]ints=newint[length];for(inti=0;i最后不要忘记尝试,否则你有泄漏非托管句柄的风险。如果我明白你想做什么,这应该对你有用。不安全{int长度=1024;//要读取的数据长度。fixed(byte*data=newbyte[length])//将数组固定到堆栈,以便可以检索指针。{返回代码;intretValue=primary_read_serial(0,&returnCode,data,length);//此时,`data`应该包含所有读取的数据。JaredPar为您提供了简单的方法,只需更改您的外部函数声明,以便C#在幕后为您进行编组。希望这能让您了解在稍低的层次上发生了什么。在写函数的P/invoke声明时,尽量使用关键字ref作为指针参数,像这样:[DllImport("YouDll.dll",EntryPoint="primary_read_serial")]publicstaticexternintprimary_read_serial(int,ref整数,参考整数,整数);我不确定您是否需要在C#中指定参数的名称。请记住,在调用该方法时,您还必须在通过引用传递的参数中使用ref。以上就是C#学习教程:Passingpointersfromunmanagedcode全部内容分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: