标签:struct c-3 c pinvoke pointers
我正在尝试创建一个C#接口,该接口从外部C DLL接收回调.
回调的参数包含指向C结构的指针,而C结构本身也具有指向不同结构的指针.
回调签名:
typedef application_event_result (*application_event_ptr)(abuffertype* read_buffer, abuffertype* write_buffer);
C中的缓冲区结构定义:
typedef struct {
uint16 size;
uint8* data;
} anotherbuffertype;
typedef struct {
anotherbuffertype *buffer;
uint16 position;
} abuffertype;
我知道回调的C#签名应使用“ ref”作为参数的指针类型.但是如何在C#中定义“ abuffertype”结构中的指针?
到目前为止,我对C#中的两个结构具有以下定义:
[StructLayout(LayoutKind.Sequential)]
public struct anotherbuffer
{
UInt16 size;
IntPtr data;
}
[StructLayout(LayoutKind.Sequential)]
public struct abuffer
{
anotherbuffer buffer;
UInt16 position;
}
但这是行不通的. C#中“缓冲”的内容不是C代码中回调之前的内容.
我是否需要手动解组内部struct指针,如果需要,怎么做?
解决方法:
您将无法从编组器获得帮助,这通常会导致严重的内存管理问题.但是可以在回调的特定情况下工作,因为管理数据的是调用C程序.
您必须自己转换数据.将指针声明为IntPtr并使用Marshal.PtrToStructure()检索数据.
anotherbuffertype.data成员看起来像一个数组,使用Marshal.Copy()将其内容复制到您自己的byte []数组中.如果您不介意unsafe关键字,则可以将其声明为byte *并使用data [index]访问元素,从而避免了复制的开销.并不是很不安全,很容易将索引限制为[0..size).
标签:struct,c-3,c,pinvoke,pointers 来源: https://codeday.me/bug/20191118/2026038.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。