0

我有结构:

public struct MyStruct
{
   public int a;
   public int b;
   public byte[] mass;
}  

我需要:将指针传递给“质量”数组到 C++ 非托管函数。完成所有工作后,它会返回我指向“质量”的指针。

所以我有 MyStruct 的列表。而且我需要知道列表中的 MyStruct 包含返回的“质量”(指向我的指针)。如果我知道指向“质量”的指针,我可以将指针减少到 8 个字节并获取指向 MyStruct 的指针吗?

如何 :

1.Get IntPtr 到“质量”数组?

2.获取 IntPtr 到 MyStruct 结构?

3.从 IntPtr 获取 MyStruct?

但是,不要使用任何复制过程,例如 Marshal.Copy...

还是有更好的方法来做我需要的事情?我可以使用像 C++ 或 IntPtr 这样的指针就足够了,我该怎么做?

4

2 回答 2

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

如何在 C# 中使用 p/invoke 将指针传递给数组?

以及有关编组器在调用非托管代码和传递数组时所做的优化的一些较低级别的信息。本质上,如果可以的话,它根本不会复制数据:

http://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.80%29.aspx

于 2013-05-14T15:24:32.710 回答
0

请注意,该结构可能有一些特定的内存对齐。您可能对此链接感兴趣

于 2013-05-14T15:29:18.243 回答