Tôi sẵn sàng sử dụng unsafe
. Làm thế nào tôi có thể nhận được một lớp địa chỉ bảng ảo và chuyển đổi nó thành một int?Nhận địa chỉ vtable trong C#?
Trả lời
(EDIT: Shoot - quên bạn có cũng để đảm bảo nó không inlined - xem chỉnh sửa)
Bạn không cần phải an toàn, nhưng bạn cần phải thực hiện chắc chắn phương pháp đã được JIT'ed (mà .PrepareMethod
không):
caveat: Tôi không hoàn toàn chắc chắn (không có một số nghiên cứu thêm) làm thế nào chính xác những con số này là dài hạn; Tôi biết rằng tại một thời điểm họ sử dụng là chính xác, như tôi đã từng được sử dụng này để thời gian chạy triển khai phương pháp hoán đổi ... 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; }
}
Tại sao nó di chuyển các chức năng xung quanh trong bộ nhớ? Chúng là đối tượng, vì vậy chúng sẽ không chỉ ở một địa chỉ liên tục (thay đổi trên mỗi biên dịch) –
@ColeJohnson Xin lỗi, bỏ lỡ khủng khiếp và không hiệu đính: Tôi muốn nói bố cục của các đối tượng và các tham chiếu khác đã thay đổi từ phiên bản thành phiên bản của CLR; đáng chú ý nhất là giữa 2.0-> 4.0. Tôi sẽ chỉnh sửa. Ngoài ra, chỉnh sửa tốt. :) – JerKimball
Điều này có vẻ rất thú vị;) –
Hãy xem bài viết này - nó dành cho .NET 1.1 nhưng đó là khởi đầu. Vì nội bộ JIT không được tài liệu hóa rất tốt, tôi không chắc điều này áp dụng như thế nào cho các phiên bản khung hiện hành.
- 1. vtable là gì trong C++
- 2. Nhận địa chỉ của hướng dẫn trong C/C++
- 3. Nhận địa chỉ email Outlook qua C#
- 4. C# Ổ cắm UDP: Nhận địa chỉ người nhận
- 5. Địa chỉ trong C: & (số)
- 6. Cách lấy địa chỉ IPv6 trong C#?
- 7. C# Nhận địa chỉ MAC của máy tính "OFFLINE"
- 8. C địa chỉ của một địa chỉ của một biến
- 9. Nhận Kinh độ Vĩ độ từ một địa chỉ C#
- 10. Cách nhận địa chỉ ô liền kề?
- 11. UdpClient nhận về địa chỉ quảng bá
- 12. địa chỉ Formatting MAC trong C#
- 13. Biến địa chỉ cố định trong C
- 14. Nhận địa chỉ IP của máy chủ trong ASP.NET?
- 15. Khi nào một vtable được tạo trong C++?
- 16. Địa chỉ mã hóa địa lý - nhận quận của một địa chỉ nhất định (Google API)
- 17. Nhận địa chỉ Bản đồ hoặc Địa chỉ Vị trí trong Android
- 18. Nhận địa chỉ IP cục bộ
- 19. Nhận địa chỉ gmail bằng ... openid? oauth?
- 20. Nhận địa chỉ IP của người dùng
- 21. Nhận địa chỉ MAC Bluetooth qua adb
- 22. Số nguyên cho Địa chỉ IP - C
- 23. Tôi có thể nhận nút NUMA từ địa chỉ con trỏ (trong C trên Linux) không?
- 24. Cần trợ giúp để nhận số cổng TCP và địa chỉ IP trong C
- 25. Giao diện vtable
- 26. Nhận địa chỉ của thuộc tính Objective-c (là cấu trúc C)
- 27. sổ địa chỉ iphone - nhận mục rỗng trong ABAddressBookGetPersonWithRecordID
- 28. Nhận địa chỉ email của tác giả trong SVN
- 29. Netty: nhận địa chỉ ip từ xa trong messageReceived
- 30. Nhận địa chỉ IP của ứng dụng khách trong JSP
Tại sao bạn muốn làm điều này? –
@DannyChen: "Để giải trí" –
Hãy xem 'OpCodes.Callvirt' thông qua trình tháo rời. http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.callvirt.aspx – Matthew