【问题标题】:How to know pointer to structure by it's array pointer?如何通过数组指针知道指向结构的指针?
【发布时间】:2013-05-14 15:20:04
【问题描述】:

我有结构:

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 这样的指针就足够了,我该怎么做?

【问题讨论】:

    标签: c# pointers structure


    【解决方案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#?

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

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

    【讨论】:

    • 我需要将数组传递给一些用 C++ 编写的 Dll。我可以使用任何声明。所以你说 SomeFunk(byte[] mass) 和 SomeFunk(IntPtr pMass) 一样?
    • @user2377299 是的,如果您传递这样的字节数组,非托管方可以将其作为unsigned char* 获取。我会在一分钟内用一些有用的链接更新我的答案。如果您还有其他需要知道的,请告诉我(但接下来的几个小时我会远离电脑)。
    • 所以。假设,DLL 使用像 Return(byte[] b) 这样的函数返回字节数组。这个字节数组属于某个父类。如何确定它,而不是使用 foreach 模式并比较其中的所有字节数组?我可以以某种方式将指针地址减少 8 个字节并获取指向我的父类的指针吗?如果,是,如何?
    【解决方案2】:

    请注意结构可能有一些特定的内存对齐。 你可能对this link感兴趣

    【讨论】:

    • 好的。如果我在 struct 之前使用 [StructLayout(LayoutKind.Sequential,Pack = 1)] 并且内存中的所有内容都很好。下一步是什么?我需要一些代码示例来满足我的需要。
    • @user2377299 对不起,我不太了解这个主题。我只记得几年前遇到过这种问题。
    猜你喜欢
    • 2017-06-03
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2010-12-21
    相关资源
    最近更新 更多