gpt4 book ai didi

c# - 如何在 C# 中获取 IntPtr 指针的属性

转载 作者:行者123 更新时间:2023-11-28 06:30:11 29 4
gpt4 key购买 nike

我在我的 C# 项目中使用了一些 C++ 包装器。问题是我有一个指向 C++ 类型 Head 的指针 hd(类型为 IntPtr),它有一个名为 xlong 的属性。我怎样才能得到那个属性(property)?我知道两种方法:

var l = ((Head)Marshal.PtrToStructure(hd, typeof(Head))).xlong;

var l = ((Head*)hd.ToPointer())->xlong;

但是有什么方法可以直接使用 Marshal 获取它吗?我还没有找到任何相关信息。如果不是,我应该使用哪种方式?

Head 定义为

[StructLayout(LayoutKind.Sequential)]
public struct Head
{
public int w;
public int h;
public double wmod;
public double hmod;
public IntPtr xlong;
public IntPtr ylong;
public int pitch;
public uint flags;
}

最佳答案

一般来说,您的两种方法可能会给出不同的结果,但它不在这里:您的 Head 结构是 blittable ,这意味着它对非托管代码和托管代码的表示完全相同。

因此,您可以使用最适合您的方法。第一种方法:

var l = ((Head)Marshal.PtrToStructure(hd, typeof(Head))).xlong;

优点是不需要您自己编写任何不安全的代码,而是由系统库来处理。

第二种方法:

var l = ((Head*)hd.ToPointer())->xlong;

优点是在提取 xlong 字段之前不会制作不必要的数据拷贝。

正如 Hans Passant 指出的那样,通过使用 Marshal.ReadIntPtr 可以直接通过 Marshal 类读取字段.这不是直接适用的:它需要您先计算偏移量。但是,Marshal 类已经包含一个为您执行此操作的方法:Marshal.OffsetOf .

如果采用这种方法,您可能希望将 Marshal.OffsetOf 的结果缓存在 static readonly 字段中,因为它永远不会改变,并且没有每次访问都需要重新计算。

关于c# - 如何在 C# 中获取 IntPtr 指针的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741351/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com