8

私は喜んで使用しますunsafe。クラス仮想テーブルアドレスを取得してintに変換するにはどうすればよいですか?

4

2 に答える 2

4

(編集:シュート-インライン化されていないことも確認する必要があることを忘れた-編集を参照)

安全でない必要はありませんが、メソッドがJITされていることを確認する必要があります(これ.PrepareMethodは可能です)。

警告:これらの数値が長期的にどれほど正確であるかは(さらに調査することなく)完全にはわかりません。私はかつてこれをランタイムスワップメソッドの実装に使用したので、ある時点でそれらが正確であったことを知っています... shh

using System;
using System.Runtime.CompilerServices;
void Main()
{
    long typeHandle = typeof(Foo).TypeHandle.Value.ToInt64();
    Console.WriteLine("addressOf(typeof(Foo)): 0x{0:x}", typeHandle);

    MethodInfo instanceMethod1 = typeof(Foo).GetMethod("InstanceFunc1");
    RuntimeHelpers.PrepareMethod(instanceMethod1.MethodHandle);
    long addressOfInstanceMethod1 = instanceMethod1.MethodHandle.GetFunctionPointer().ToInt64();
    Console.WriteLine("foo.InstanceFunc1:      0x{0:x}", addressOfInstanceMethod1);

    MethodInfo instanceMethod2 = typeof(Foo).GetMethod("InstanceFunc2");
    RuntimeHelpers.PrepareMethod(instanceMethod2.MethodHandle);
    long addressOfInstanceMethod2 = instanceMethod2.MethodHandle.GetFunctionPointer().ToInt64();
    Console.WriteLine("foo.InstanceFunc2:      0x{0:x}", addressOfInstanceMethod2);

    MethodInfo staticMethod = typeof(Foo).GetMethod("StaticFunc");
    RuntimeHelpers.PrepareMethod(staticMethod.MethodHandle);
    long addressOfStaticMethod = staticMethod.MethodHandle.GetFunctionPointer().ToInt64();
    Console.WriteLine("Foo.StaticFunc:         0x{0:x}", addressOfStaticMethod);
}

public class Foo
{
   [MethodImpl(MethodImplOptions.NoInlining)]
   public static int StaticFunc() { return 1; } 
   [MethodImpl(MethodImplOptions.NoInlining)]
   public int InstanceFunc1() { return 1; } 
   [MethodImpl(MethodImplOptions.NoInlining)]
   public int InstanceFunc2() { return 1; }
}
于 2013-01-05T03:58:13.710 に答える
1

この記事を見てください-それは.NET1.1用ですが、それは始まりです。JITの内部は十分に文書化されていないため、これが現在のフレームワークバージョンにどの程度適用されるかはわかりません。

CLRがランタイムオブジェクトを作成する方法

このSOの質問も役立つ場合があります。

于 2013-01-05T03:26:19.390 に答える