【问题标题】:Cast pointer to generic structure将指针转换为泛型结构
【发布时间】:2013-08-10 21:16:34
【问题描述】:

我正在尝试将一个指针投射到一个通用结构(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给了我: 附加信息:操作可能会破坏运行时的稳定性。

我做错了什么? 有谁知道解决这个问题的更好方法(指向通用结构)或发现这个函数有错误?

【问题讨论】:

    标签: c# generics pointers structure unsafe


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。我不记得了。但不幸的是,这是真的:无法从程序集“ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”加载类型“PointerToStructure`1”,因为泛型类型不能具有显式布局。
    • 您可以忘记泛型,将其作为对象传递并在调用者中回滚。
    • 我尝试了一个界面,但它给了我一个错误(地址不能重叠......)。我不能使用对象,因为对象没有特定的大小(如果您的意思是 FieldOffset(0)]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2016-05-05
    • 2015-07-13
    • 2023-02-26
    相关资源
    最近更新 更多