C# 将'ref SomeStruct'转换为IntPtr

C# 将'ref SomeStruct'转换为IntPtr,c#,interop,C#,Interop,我有以下问题 public void SendMessage(IntPtr wParam) { // ... } 我有一个结构,例如 public struct BlittableStruct { public int x; } 我想定义一个调用IntPtr重载的SendMessage重载 public void SendMessage(ref BlittableStruct bs) { SendMessafe(???); } 那么:如何在c中将这个ref转换成一个b

我有以下问题

public void SendMessage(IntPtr wParam)
{
   // ...
}
我有一个结构,例如

public struct BlittableStruct
{
    public int x;
}
我想定义一个调用IntPtr重载的
SendMessage
重载

public void SendMessage(ref BlittableStruct bs)
{
    SendMessafe(???);
}
那么:如何在c中将这个ref转换成一个blittable结构,再转换成一个IntPtr呢#


性能很重要,因此最好选择性能最高的选项。我还需要保留引用语义,因此
封送.StructureToPtr
不是一个选项。

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

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

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

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

我不确定,但我认为不可能得到引用
Blittable
结构的
IntPtr
。第一-
structs
使用堆内存空间,而对象使用堆栈。第二,
Blittable
IntPtr
之间没有协方差,我不确定,但我认为不可能得到引用
Blittable
结构的
IntPtr
。第一-
structs
使用堆内存空间,而对象使用堆栈。第二,
Blittable
IntPtr
之间没有协方差,我的目的是修改传入的原始结构,因此ref语义非常重要!您认为您违背了托管代码的目的是什么。Microsoft开发了托管代码,以最大限度地减少导致电脑死机的蓝屏异常数量。使用“不安全”会增加蓝屏的可能性。如果您想使用不安全的代码,那么在C++中编程。我的意图是修改传入的原始结构,因此REF语义非常重要。您认为您违背了托管代码的目的是什么。Microsoft开发了托管代码,以最大限度地减少导致电脑死机的蓝屏异常数量。使用“不安全”会增加蓝屏的可能性。如果你想使用不安全的代码,那么在C++中编程。