C# unsafe 非托管对象指针转换
今天被大佬用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