读书人

怎么获得一个class类型类量的指针

发布时间: 2012-01-31 21:28:41 作者: rapoo

如何获得一个class类型类量的指针
貌似传统方法,只能到取结构类型的:
http://topic.csdn.net/u/20090825/16/725bc96a-33f9-4c63-85ef-01d22d6c1ed2_3.html
说明见:292楼~~

C# code
using System;namespace ConsoleApplication9{    public struct BofStruct { }    public class BofClass { }    class Program    {        unsafe static void Main(string[] args)        {            //--准备            BofStruct bs = new BofStruct();            BofClass bc = new BofClass();            //--测试            //Console.WriteLine("BofStruct'sizeof:{0}", sizeof(BofClass));            //无法获取托管类型(“BofClass”)的地址和大小,或无法声明指向它的指针            Console.WriteLine("BofStruct'sizeof:{0}", sizeof(BofStruct));            //BofStruct'sizeof:4            //Console.WriteLine("bc'pointer:{0:X8}", (uint)&bc);            //无法获取托管类型(“BofClass”)的地址和大小,或无法声明指向它的指针            Console.WriteLine("bc'pointer:{0:x8}", (uint)&bs);            //bc'pointer:057fecd0            //--使用            int num;            int* p;            p = #            *p = 999;            System.Console.WriteLine("p:{0}", *p);            System.Console.WriteLine("p:{0}", p->ToString());            Console.ReadKey();        }    }}


也许也有别的方法吧~~

[解决办法]
进来学习~~学习
[解决办法]
好像不能去的吧
[解决办法]
up
[解决办法]
class类的指针==引用啊>???

为什么要绕圈子呢?
[解决办法]
路过
[解决办法]
C#里得到对象地址有什么意义?
[解决办法]
指针类型中,在 * 前面指定的类型称为该指针类型的目标类型 (referent type)。它表示该指针类型的值所指向的变量的类型。
与引用(引用类型的值)不同,指针不受垃圾回收器跟踪(垃圾回收器并不知晓指针和它们指向的数据)。出于此原因,不允许指针指向引用或者包含引用的结构,并且指针的目标类型必须是 unmanaged-type。
unmanaged-type 是任何不是 reference-type 并且在任何嵌套级别都不包含 reference-type 字段的类型。换句话说,unmanaged-type 是下列类型之一:
?sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。
?任何 enum-type。
?任何 pointer-type。
?任何由用户定义的只包含 unmanaged-types 字段的 struct-type。
将指针和引用进行混合使用时的基本规则是;引用(对象)的目标可以包含指针,但指针的目标不能包含引用。


[解决办法]
好象没了吧。
C++多。
[解决办法]
探讨
@健健

不一定要把引用类型转成指针类型,

有没有办法,获得引用类型的地址.

哪怕是一些非常规的办法,

比如直接从内存中找,

或者过外部程序(比如用C++)

或者能够得知一连串引用类型地址的先后顺序也行.

GC方法有没有办法,我还没有研究过.

总之,办法肯定是有的,不限定在C#中(但必须是C#的程序集.)

[解决办法]
类对象是可以移动的,所以不能获取其地址

如果你非要获取,可以参考这个方法:
fixed类中的第一字段,然后取得该字段的地址

但是我想这个类的内存布局不能是Auto,只能是按顺序或显式布局吧
[解决办法]
关注
[解决办法]
用委~~delegate~~
[解决办法]
我的印象中,似乎无法获得托管类型的指针。
[解决办法]
up
------解决方案--------------------


关注中。。。
[解决办法]
up
[解决办法]
帮顶!希望能在这个帖子看到确切的说法!
[解决办法]
C#的指针有点怪怪的,没有C++的纯

[解决办法]
每隔一定时间,抓取屏幕截屏,分析指定位置的颜色值,然后...
?????
[解决办法]
搞到后面不知道你问什么了,对于你前一个问题,确实是没有必要的,虽然引用说会分配同一个地址,其实C++也会,但是需要前一个地址已经作废的情况下,那么系统才进行重新分配,这个重新分配,其他类都可能会重新分配到这个地址里面,即使分配到同一个地址下,地址下的数据实际调用时会被重写,不要认为分配到同个地址下,那些数据就会被系统保存下作为新类的数据而使用。
另外试下Marshal.GetComInterfaceForObject是否得到你需要的
[解决办法]
指针??
[解决办法]
太厉害了,这就解决啦,先顶下,慢慢来看
[解决办法]
引用类型有指针类型的一切好的方面 而没有他一切不好的方面, 泛是指会能做的引用就能做,而且没副作用,
我是这么理解的;
[解决办法]

探讨
@ProjectDD
先去了解一下指针,了解一下Marshal
也许你会换个看法。

没有指针,C#只能做C++10%的事情。
有了指针,C#能够做C++90%的事情。

如果你不打算与其它系统交互,引用类型也许足够了。
要是你打算涉足图像、游戏、视频、算法、密码、Shell的话,
看看引用类型还能帮得上忙嘛?


[解决办法]
友情帮顶~
[解决办法]
学习中,哈哈
[解决办法]
User.class
Class.forName("PackageName.ClassName");
[解决办法]
进来学习~~
[解决办法]
不错,不错,学习学习.
[解决办法]
指针,很爱、很恨。。。。
[解决办法]
发现这个帖子有进展了,进来回个帖。
因为内容比较多,代码我就不仔细看了。发现提到了一个Marshal 类,啊,好东西啊,有了那个类,类似指针的操作就不难做到了,其实也就是把地址传递给接口,C#本身不需要直接操作指针的,没有意义。至于楼主后来使用的GCHandle,在Marshal 类中也提到过,MSDN上真的很详细。Marshal 类复制托管资源到非托管资源,而GCHandle可以直接固定托管资源,使其作为非托管资源传递。
[解决办法]
支持一下
[解决办法]
顶顶
[解决办法]
点点滴滴顶顶
[解决办法]
ddddddddddddddddddd
[解决办法]
.
[解决办法]
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
[解决办法]
学习了
[解决办法]
还挺难
[解决办法]
???
[解决办法]
还挺难的!

[解决办法]
指针是挺难的。
------解决方案--------------------


呵呵
[解决办法]
来看看先...
[解决办法]
kankan
[解决办法]
Mark!
[解决办法]
学习........
[解决办法]
up
[解决办法]
路过
[解决办法]
逛逛

[解决办法]
up
[解决办法]

探讨
代码并不完善,要解决的问题更多了。

包括:class在堆上不是简单的几个字段,比如TypeHandle和SyncBlockIndex


简单测试代码:
C# codeusing System;using System.Runtime.InteropServices;publicclass BoxedObject : IDisposable
{privateobject _boxedObject;private GCHandle _memData;public BoxedObject(object boxObject)
{if (boxObject==null)
{thrownew ArgumentNullException();
}
_boxedObject= boxObject;
}~BoxedObject()
{
(thisas IDisposable).Dispose();
}publicobject Value
{get {return _boxedObject; }set
{if (value==null)
{thrownew ArgumentNullException();
}if (value.GetType()!= _boxedObject.GetType())
{thrownew NotSupportedException(string.Format("Can not set [{0}] value to [{1}] object",
value.GetType().Name,
_boxedObject.GetType().Name));
}if (!_memData.IsAllocated)
{
_memData= GCHandle.Alloc(_boxedObject);
}
IntPtr pMemData= GCHandle.ToIntPtr(_memData);
IntPtr pBox=new IntPtr((Marshal.ReadIntPtr(pMemData).ToInt64()+ IntPtr.Size));
Marshal.StructureToPtr(value, pBox,false);
}
}void IDisposable.Dispose()
{if (_memData.IsAllocated)
_memData.Free();
}
}class Program
{staticvoid Main1(string[] args)
{object test=100;
Console.WriteLine("original value="+ test.ToString()+", hash="+ test.GetHashCode());
BoxedObject b=new BoxedObject(test);
b.Value=1000;
Console.WriteLine("after edit value="+ test.ToString()+", hash="+ test.GetHashCode());

Console.ReadKey();
}
}

[解决办法]
object data = new object();
GCHandle handle = GCHandle.Alloc(data);
void* pVer = handle.AddrOfPinnedObject().ToPointer();
// do something.
handle.Free();


[解决办法]
1 楼主研究的努力,探索支持
[解决办法]
学习
[解决办法]
MARK
[解决办法]
路过,不能错过
[解决办法]
!!xuexila
[解决办法]
up
[解决办法]
GOOD

[解决办法]
学习
[解决办法]
积分积分哦,,,,,
[解决办法]
顶一下

[解决办法]
10分
[解决办法]

[解决办法]
好像不能去的啊
[解决办法]
有意义么?
[解决办法]
学习学习

读书人网 >C#

热点推荐