我有结构:
public struct MyStruct
{
public int a;
public int b;
public byte[] mass;
}
我需要: 将poiner传递给“mass”数组到C ++非托管函数。 在完成所有工作后,它将返回指向“质量”的指针。
所以我有MyStruct列表。我需要知道列表中的MyStruct包含返回的“质量”(指向我的指针)。 如果我知道指向“质量”的指针,我可以减少指向8个字节的指针并将指针指向MyStruct吗?
如何:
1.获取IntPtr到“质量”数组?
2.获取IntPtr到MyStruct结构?
3.从IntPtr获取MyStruct?
但是,不要使用任何复制程序,例如Marshal.Copy ......
或者有更好的方法来做我需要的吗?我可以使用像C ++或IntPtr这样的指针,我该怎么做?
答案 0 :(得分:1)
假设数组的内存由托管代码分配:
当你通过P / Invoke将数组传递给非托管函数时,默认情况下,数组通常由编组器固定在内存中,这样就不必复制数组使用的内存。
您根本不需要使用IntPtr - 您只需要声明P / Invoke以便它接受数组参数。
但是,如果非托管代码正在分配要返回给托管代码的内存,则情况会有所不同;事情变得更加困难。
假设情况并非如此,那么如果您能向我们展示“C”函数声明,我们可能会提出P / Invoke声明。
(我确实感觉你的情况可能有点复杂但是......)
一些有用的链接:
http://msdn.microsoft.com/en-us/library/z6cfh6e6%28v=vs.80%29.aspx
http://msdn.microsoft.com/en-us/library/zah6xy75.aspx
How can I pass a pointer to an array using p/invoke in C#?
有关marshaller在调用非托管代码和传递数组时所做的优化的一些较低级别信息。基本上,如果可以,它根本不会复制数据:
http://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.80%29.aspx
答案 1 :(得分:0)
请注意,因为结构可能具有一些特定的内存对齐方式。 您可能对this link
感兴趣