1,得到某个类的实例的指针。
MyClass newClass = new MyClass();
RuntimeTypeHandle handle = newClass.GetType().TypeHandle;
IntPtr ptr  = handle.Value;
这样就得到了指向该类实例的指针。2.根据已知指针返回某个类的实例
int handler = XXXX;
IntPtr ptr = new IntPtr(handler);
Object obj = Pointer.Box(ptr,typeof(newClass));
这样就根据指针得到了所需要的对象了。
注:以上代码转至网络。我用MyClass newClass = new MyClass();
RuntimeTypeHandle handle = newClass.GetType().TypeHandle;
IntPtr ptr  = handle.Value;
Object obj = Pointer.Box(ptr,typeof(MyClass));做测试,编译不通过:无法从“System.IntPtr”转换为“void*”代码做了如下修改:MyClass newClass = new MyClass();
RuntimeTypeHandle handle = newClass.GetType().TypeHandle;
IntPtr ptr  = handle.Value;
Object obj = Pointer.Box(ptr.ToPointer(),typeof(MyClass));运行时在最后一行报错:类型必须是指针。参数名: ptr后来把MyClass改为结构体(值类型),代码改为:MyClass newClass = new MyClass();
RuntimeTypeHandle handle = newClass.GetType().TypeHandle;
IntPtr ptr  = handle.Value;
Object obj = Pointer.Box(ptr.ToPointer(),typeof(MyClass*));
运行是可以了。但是obj并不是newClass对象,而是一个Pointer类型的对象。我的问题是:如果把最后得到的obj,转成newClass对象?

解决方案 »

  1.   

    强制类型转换
    MyClass mc = (MyClass)obj;
      

  2.   

    1.引用的托管堆地址和指针是有区别的...2.引用的托管堆地址不是固定的,GC的回收可能导致其改变....NET不是C++,不要走火入魔...
      

  3.   

    不对。没测试。这样才对。
    MyClass* p = (MyClass*)Pointer.Unbox(obj);
    MyClass mc = *p;
    Console.WriteLine(mc.i.ToString());
      

  4.   


    我测试过了,运行没问题,但是mc里的成员的值都跟newClass不一样了。有道理。
      

  5.   

    想找指针么?很简单。没这么复杂。private static void TestObject()
    {
        MyClass newClass = new MyClass();
        newClass.i = 100;
        unsafe
        {
            MyClass* p = &newClass;
            MyClass obj = *p;
            Console.WriteLine(obj.i.ToString());
        }
    }public struct MyClass { public int i { get; set; } }
      

  6.   


    这个我知道,刚刚做 了这样的测试,呵呵,以前也学过C++
    引用的托管堆地址不是固定的,GC的回收可能导致其改变。这个没错,但是在这个例子中,是值类型的,不是托管堆,应该是堆栈才是。