首页 > 解决方案 > 将 `ref SomeStruct` 转换为 IntPtr

问题描述

我有以下重载

public void SendMessage(IntPtr wParam)
{
   // ...
}

我有一个结构,例如

public struct BlittableStruct
{
    public int x;
}

我想定义一个SendMessage调用 IntPtr 重载的重载。

public void SendMessage(ref BlittableStruct bs)
{
    SendMessafe(???);
}

所以:如何在 c# 中将此 ref 转换为 blittable 结构到 IntPtr

性能很重要,因此性能最高的选项是理想的。我还需要保留引用语义,所以Marshal.StructureToPtr不是一个选择。

标签: c#interop

解决方案


您需要将 BlittableStruct 从托管内存转换为非托管内存。尝试以下:

        public void SendMessage(BlittableStruct bs)
        {
            IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(bs));
            Marshal.StructureToPtr(bs, ptr, true);
            SendMessage(ptr);
        }

推荐阅读