您当前的位置:首页 > 文章 > C# unsafe 非托管对象指针转换

C# unsafe 非托管对象指针转换

作者:墨池象牙白 时间:2023-09-18 阅读数:277 人阅读

今天被大佬用unsafe秀了一波,稍微记录一下

如何获取指针所指的非托管对象(这里是结构体)AsRef

以及反过来,用非托管对象获取对应的指针 AsPointer

    struct A_Part
    {
        public int f1;
        public int f2;
    }
 
    unsafe class Program
    {
 
        static T* Alloc<T>(int size = 1) where T : unmanaged
        {
            Console.WriteLine(Marshal.SizeOf<T>());
            IntPtr begin = Marshal.AllocHGlobal(Marshal.SizeOf<T>() * size);
            return (T*)begin;
        }
 
        static ref T ToRef<T>(void* ptr) => ref Unsafe.AsRef<T>(ptr);
 
        static T* ToPointer<T>(ref T value) where T : unmanaged => (T*)Unsafe.AsPointer(ref value);
        static void Free(void* begin)
        {
            Marshal.FreeHGlobal((IntPtr)begin);
        }
 
        static void Main(string[] args)
        {
            A_Part* ptr = Alloc<A_Part>();
            ptr->f1 = 1;
            Console.WriteLine($"original  ptr f1:{ptr->f1}");
 
            A_Part a = *ptr;
            a.f1 = 2;
            Console.WriteLine($"after A   ptr f1:{ptr->f1}");
 
            ref A_Part reft = ref ToRef<A_Part>(ptr);
            reft.f1 = 3;
            Console.WriteLine($"after ref ptr f1:{ptr->f1}");
 
            A_Part* ref_ptr = ToPointer(ref reft);
 
            Console.WriteLine($"ref_ptr f1:{ref_ptr->f1}");
            Free(ptr);
            Console.ReadKey();
        }
    }

本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com