obsidian/笔记文件/2.笔记/Marshal.PtrToStructure.md
2025-03-26 00:02:56 +08:00

1.9 KiB

#unity/日常积累

Marshal.PtrToStructure 是 C# 中的一个方法,它属于 System.Runtime.InteropServices 命名空间。这个方法的主要作用是将一个非托管内存块的指针转换成一个结构体的实例。换句话说,它允许你将非托管代码中的数据转换成一个 C# 结构体,以便在托管代码中更方便地处理这些数据。

使用 Marshal.PtrToStructure 方法时,你需要提供两个参数:一个是指向非托管内存块的 IntPtr 指针,另一个是你想要将数据转换成的结构体的类型。

以下是一个使用 Marshal.PtrToStructure 方法的示例:

using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
    public int Field1;
    public double Field2;
}

class Program
{
    [DllImport("SomeUnmanagedLibrary.dll")]
    private static extern IntPtr GetUnmanagedData();

    static void Main()
    {
        // 假设 GetUnmanagedData 返回了一个指向非托管数据的指针
        IntPtr ptr = GetUnmanagedData();

        // 使用 Marshal.PtrToStructure 将非托管数据转换成一个 MyStruct 实例
        MyStruct myStruct = (MyStruct)Marshal.PtrToStructure(ptr, typeof(MyStruct));

        // 现在你可以访问 myStruct 中的字段了
        Console.WriteLine($"Field1: {myStruct.Field1}, Field2: {myStruct.Field2}");
    }
}

在这个示例中,我们首先定义了一个 MyStruct 结构体,它有两个字段:Field1 和 Field2。然后,我们声明了一个外部方法 GetUnmanagedData,它返回一个指向非托管数据的 IntPtr 指针。在 Main 方法中,我们调用 GetUnmanagedData 获取指针,并使用 Marshal.PtrToStructure 方法将这个指针转换成一个 MyStruct 实例。最后,我们访问并打印出结构体中的字段值。