最近,在这个问题中,我已经问过如何在C#中获取类的原始内存地址(这是一个粗略的不可靠的黑客和一个不好的做法,除非你真的需要它,否则不要使用它).我成功了,但后来出现了一个问题:根据这篇文章,类原始内存表示中的前2个字应该是指向SyncBlock和RTTI结构的指针,因此第一个字段的地址必须偏移2个字 [ 8个字节 in 从一开始就是32位系统,64 位系统中的16个字节.但是,当我从对象位置的内存中转储第一个字节时,第一个字段与对象地址的原始偏移量只有1个32位字(4个字节),这对两种类型的系统都没有任何意义.从我链接的问题:
class Program
{
// Here is the function.
// I suggest looking at the original question's solution, as it is
// more reliable.
static IntPtr getPointerToObject(Object unmanagedObject)
{
GCHandle gcHandle = GCHandle.Alloc(unmanagedObject, GCHandleType.WeakTrackResurrection);
IntPtr thePointer = Marshal.ReadIntPtr(GCHandle.ToIntPtr(gcHandle));
gcHandle.Free();
return thePointer;
}
class TestClass
{
uint a = 0xDEADBEEF;
}
static void Main(string[] args)
{
byte[] cls = new byte[16];
var test = new …Run Code Online (Sandbox Code Playgroud)