私は喜んで使用しますunsafe
。クラス仮想テーブルアドレスを取得してintに変換するにはどうすればよいですか?
user34537
質問する
466 次
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の内部は十分に文書化されていないため、これが現在のフレームワークバージョンにどの程度適用されるかはわかりません。
于 2013-01-05T03:26:19.390 に答える