将指针转换为通用结构

时间:2013-08-10 21:16:34

标签: c# generics pointers structure unsafe

我正在试图投射指向通用结构的指针(blittable)。 当我使用非通用结构时,一切似乎都很好=>然后我能够使用Marshal.PtrToStructure(...),但该函数不接收通用结构(为什么?)

所以我写了以下内容:

public static object ReadValue<T>(IntPtr ptr) where T : struct
    {
        var dm = new DynamicMethod("$", typeof(T), Type.EmptyTypes);
            ILGenerator il = dm.GetILGenerator();
            il.Emit(OpCodes.Ldc_I4, ptr.ToInt32());
            il.Emit(OpCodes.Ldobj, typeof(T));
            il.Emit(OpCodes.Ret);

            var func = (Func<T>)dm.CreateDelegate(typeof(Func<T>));
            return func();
    }

但是现在Ldobj指令出了问题。 VS给了我: 附加信息:操作可能会破坏运行时的稳定性。

我做错了什么? 有没有人知道更好地处理这个问题(ptr到通用结构)或者在这个函数中发现了错误?

1 个答案:

答案 0 :(得分:1)

我不确定这是否适用于通用指针,但在.net中有一种方法可以在类型之间进行低级别转换。它涉及StructLayout属性和FieldOffset为0的多个字段。

http://netpl.blogspot.com/2010/10/is-net-type-safe.html