C# 如何在C中获取IntPtr指针的属性# 我在C++项目中使用了一些C++包装。问题是,我有一个指针 HD < /C>(类型 ItpTrt/COD>)到C++类型头>代码>,它有一个属性叫做“代码> xLouns/Cuth>”。我怎样才能得到那笔财产?我知道两种方法: var l = ((Head)Marshal.PtrToStructure(hd, typeof(Head))).xlong;

C# 如何在C中获取IntPtr指针的属性# 我在C++项目中使用了一些C++包装。问题是,我有一个指针 HD < /C>(类型 ItpTrt/COD>)到C++类型头>代码>,它有一个属性叫做“代码> xLouns/Cuth>”。我怎样才能得到那笔财产?我知道两种方法: var l = ((Head)Marshal.PtrToStructure(hd, typeof(Head))).xlong;,c#,c++,pointers,C#,C++,Pointers,及 但是,有没有办法直接使用Marshal获得它?我没有发现任何关于它的东西。如果没有,我应该使用哪种方式 头部定义为 [StructLayout(LayoutKind.Sequential)] public struct Head { public int w; public int h; public double wmod; public double hmod; public IntPtr xlong; public IntPtr ylon

但是,有没有办法直接使用Marshal获得它?我没有发现任何关于它的东西。如果没有,我应该使用哪种方式

头部
定义为

[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
struct是,这意味着它对非托管代码和托管代码的表示完全相同

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

它的优点是不要求您自己编写任何不安全的代码,而是让系统库处理这些代码

第二种方法:

优点是在提取
xlong
字段之前,不会对数据进行不必要的复制

正如Hans Passant指出的那样,通过使用。这并不直接适用:它要求您首先计算偏移。但是,
Marshal
类已经包含一个为您执行此操作的方法:


如果采用这种方法,您可能希望将
Marshal.OffsetOf
的结果缓存在
静态只读
字段中,因为它永远不会更改,并且无需为每次访问重新计算它。

与您的实际问题无关,但您的属性名称不会
太长。这是C++和C语言中的关键字。除此之外,它将(稍微)取决于
头的定义。一般来说,你的两种方法不一定给出相同的结果。如果你能展示你的C#类
Head
是如何定义的,那会很有帮助。你是对的,属性是
xlong
<代码>头实际上是一个结构。下面是它的代码:谢谢,我冒昧地把它添加到你的问题中。使用。用Marshal.OffsetOf()计算偏移量,通常在静态构造函数中。@HansPassant嘿,我在写我的答案时,你只指出了
ReadIntPtr
,还没有提到
OffsetOf
。现在看起来有点傻。谢谢你的解释!我想我会使用
Marshal.ReadIntPtr
方法,因为它不需要不安全的代码,而且(我想)在获取属性之前也不需要获取结构。再次感谢!同样,如果我只想提取一次字段,我应该使用第二种方法吗?@user2223034如果你只想提取一次,请使用最容易阅读和完全理解的形式。哪一个是,我不能为你做决定。好吧,不管怎样,现在我似乎不得不不止一次地使用这些字段。谢谢你。当做
[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;
}
var l = ((Head)Marshal.PtrToStructure(hd, typeof(Head))).xlong;
var l = ((Head*)hd.ToPointer())->xlong;