Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从IntPtr句柄键入_C#_.net_Clr - Fatal编程技术网

C# 从IntPtr句柄键入

C# 从IntPtr句柄键入,c#,.net,clr,C#,.net,Clr,是否可以从IntPtr类型句柄获取对象,该句柄可以通过以下方式获取: 例如: TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true 编辑:我很高兴有很多乐于助人的人认为我在尝试解决其他问题,但我正在寻找这个特定问题的答案,对此我非常确定。很抱歉,我一开始没有具体说明 编辑2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种返回这个结构的托管类型对象的方法。我需要将指

是否可以从IntPtr类型句柄获取对象,该句柄可以通过以下方式获取:

例如:

TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true
编辑:我很高兴有很多乐于助人的人认为我在尝试解决其他问题,但我正在寻找这个特定问题的答案,对此我非常确定。很抱歉,我一开始没有具体说明


编辑2:类型句柄是指向CLR中表示RTTI的结构的指针。我不想从这个结构中读取数据,我想要一种返回这个结构的托管类型对象的方法。我需要将指针转换为对象。

我们通常不允许任何人射中他们的脚,但你似乎坚持你需要这样做,你知道你在做什么

以下是你如何射中你的脚:

private static Type GetTypeFromHandle(IntPtr handle)
{
    var method = typeof(Type).GetMethod("GetTypeFromHandleUnsafe", BindingFlags.Static | BindingFlags.NonPublic);
    return (Type)method.Invoke(null, new object[] { handle });
}

private static void Main(string[] args)
{
    IntPtr handle = typeof(string).TypeHandle.Value;//Obtain handle somehow

    Type type = GetTypeFromHandle(handle);
}

我们通常不允许任何人射杀他们的脚,但你似乎坚持你需要这样做,而且你知道你在做什么

以下是你如何射中你的脚:

private static Type GetTypeFromHandle(IntPtr handle)
{
    var method = typeof(Type).GetMethod("GetTypeFromHandleUnsafe", BindingFlags.Static | BindingFlags.NonPublic);
    return (Type)method.Invoke(null, new object[] { handle });
}

private static void Main(string[] args)
{
    IntPtr handle = typeof(string).TypeHandle.Value;//Obtain handle somehow

    Type type = GetTypeFromHandle(handle);
}

调用内部方法的另一种方法是滥用TypedReference:

    private struct TypedReferenceAccess
    {
        public IntPtr Value;
        public IntPtr Type;
    }

    private static unsafe Type GetTypeFromTypeHandle(IntPtr handle)
    {
        TypedReferenceAccess tr = new TypedReferenceAccess()
        {
            Type = handle
        };
        return __reftype(*(TypedReference*)&tr);
    }

这当然取决于TypedReference的布局,因此确实不安全。但是由于从TypeHandle获取类型实际上是不受支持的,如果你真的想,你必须选择你的毒药。尽管我不得不说,我发现本机TypeHandle被公开,但却没有任何其他方法,这有点奇怪。

调用内部方法的另一种方法是滥用TypedReference:

    private struct TypedReferenceAccess
    {
        public IntPtr Value;
        public IntPtr Type;
    }

    private static unsafe Type GetTypeFromTypeHandle(IntPtr handle)
    {
        TypedReferenceAccess tr = new TypedReferenceAccess()
        {
            Type = handle
        };
        return __reftype(*(TypedReference*)&tr);
    }

这当然取决于TypedReference的布局,因此确实不安全。但是由于从TypeHandle获取类型实际上是不受支持的,如果你真的想,你必须选择你的毒药。尽管我不得不说,我发现本地类型句柄公开,但却没有任何其他方法,这有点奇怪。

@YuvalItzchakov当然。将表示类型句柄的IntPtr转换为System.type实例。我想我已经说清楚了。@SriramSakthivel我正试图解决这个特殊的问题。你能理解我们为什么一次又一次地问你吗?我强烈怀疑你有不同的问题,你正在制造另一个问题。IntPtr从何而来?@YuvalItzchakov我必须有理由需要解决这个问题吗?我只想找到这个问题的答案,而不是别的。@YuvalItzchakov当然。将表示类型句柄的IntPtr转换为System.type实例。我想我已经说清楚了。@SriramSakthivel我正试图解决这个特殊的问题。你能理解我们为什么一次又一次地问你吗?我强烈怀疑你有不同的问题,你正在制造另一个问题。IntPtr从何而来?@YuvalItzchakov我必须有理由需要解决这个问题吗?我只寻求这个特定问题的答案,没有其他问题。谢谢!这正是我想要的。我搜索了打字课,但一定没找到。谢谢!这正是我想要的。我搜索了Type类,但肯定没找到。