рдПрдХ .Net рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛ рд░рд╣реА рд╣реИ



рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ "рдХреНрдпреЛрдВ?" рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :) рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдФрд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SyncBlockIndex рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛, рдпрд╛ рдПрдХ MethodTable рд▓реЗрдирд╛ рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ, рдЙрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВред рдЖрдк рдкрд░рд╛рд╡рд░реНрддрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЗрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдИ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЦреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдЖрддреНрдо-рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдмрд╣рд░рд╣рд╛рд▓, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред







рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 1


рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рджреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдХреЗ рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЙрдирдХрд╛ рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг рд╕реЗрдЯ рдХрд░реЗрдВред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?



рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SafePtr рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд░реНрдл рджреЛ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ: ReferenceType (1) рдФрд░ IntPtrWrapper (2) рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЧреБрдг - (5) рдФрд░ (6), рдЬреЛ рдПрдХ рдСрдлрд╕реЗрдЯ 0 (3) рдФрд░ (4) рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

[StructLayout(LayoutKind.Explicit)] public struct SafePtr { // (1) public class ReferenceType { public object Reference; } // (2) public class IntPtrWrapper { public IntPtr IntPtr; } // (3) [FieldOffset(0)] private ReferenceType Obj; // (4) [FieldOffset(0)] private IntPtrWrapper Pointer; public static SafePtr Create(object obj) { return new SafePtr { Obj = new ReferenceType { Reference = obj } }; } public static SafePtr Create(IntPtr rIntPtr) { return new SafePtr { Pointer = new IntPtrWrapper { IntPtr = rIntPtr } }; } // (5) public IntPtr IntPtr { get { return Pointer.IntPtr; } set { Pointer.IntPtr = value; } } // (6) public Object Object { get { return Obj.Reference; } set { Obj.Reference = value; } } public void SetPointer(SafePtr another) { Pointer.IntPtr = another.Pointer.IntPtr; } }
      
      





рдФрд░ рдЕрдВрдд рдореЗрдВ, рдХрд╛ рдЙрдкрдпреЛрдЧ:

  var safeptr = SafePtr.Create(new object()); Console.WriteLine("Address of object is: {0}", safeptr.IntPtr.ToInt32());
      
      





рдпрд╣ рд╕рдм :) рдЖрдк рдЗрд╕реЗ рдПрдХ рд╕рд╛рдл рд╕реВрдЪрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  var safeptr = SafePtr.Create(new object()); unsafe { ((int *)safeptr.IntPtr)* = 0; } Console.WriteLine("Address of object is null: {0}", safeptr.Object == null);
      
      





рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 2


рдПрдХ рдФрд░, рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рдХрдбрд╝рд╛рдИ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП .net рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рд░реЗрдЧреБрд▓рд░ рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рдЬрдЧрд╣ рдвреВрдВрдврдиреА рд╣реЛрдЧреА, рдЬрд╣рд╛рдВ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЧреБрдо рд╣реЛ рдЬрд╛рдПред рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдм рд╡рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдРрд╕реА рдЬрдЧрд╣ рд╣реИ: рдПрдХ рдзрд╛рд░рд╛ рдвреЗрд░ред .Net рдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдЯреНрд░реАрдо рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрдЧрд░ .Net рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЖрдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) 32-рдмрд┐рдЯ рдорд╢реАрди рдкрд░ рд╣реИред 4 рдмрд╛рдЗрдЯреНрд╕, рддреЛ рдЖрдк рдмрд╕ рд╡рд╣рд╛рдБ рд╕реЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдкрд░ JITTER рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред



C # рд╣рдореЗрдВ рд╕реНрдЯреИрдХ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг:

  int pointer = new Object();
      
      





рдпрд╣ рдирд┐рд╖рд┐рджреНрдзред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ MSIL рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкрд░ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рддрд░реАрдХреЗ (EntityPtr.il) рд▓рд┐рдЦреЗрдВ:

 // Metadata version: v2.0.50215 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 2:0:0:0 } .assembly EntityPtr { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .hash algorithm 0x00008004 .ver 1:0:0:0 } .module sample.exe // MVID: {A224F460-A049-4A03-9E71-80A36DBBBCD3} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // =============== CLASS MEMBERS DECLARATION =================== .class public auto ansi abstract sealed beforefieldinit System.Runtime.CLR.EntityPtr extends [mscorlib]System.Object { .method public hidebysig static native int ToPointer<TType> ( !!TType input ) cil managed { // Method begins at RVA 0x2254 // Code size 7 (0x7) .maxstack 2 .locals init ( [0] native int CSS ) ldarg.0 conv.i4 ldc.i4 4 sub conv.i ret } // end of method Converter::ToPointer .method public hidebysig static native int ToPointerWithOffset<TType> ( !!TType input ) cil managed { // Method begins at RVA 0x2254 // Code size 7 (0x7) .maxstack 2 .locals init ( [0] native int CSS ) ldarg.0 ret } // end of method Converter::ToPointer // Methods .method public hidebysig static !!TType ToInstance<TType> ( native int input ) cil managed { // Method begins at RVA 0x2254 // Code size 7 (0x7) .maxstack 2 .locals init ( [0] native int CSS ) ldarg.0 conv.i4 ldc.i4 4 add conv.i ret } // end of method Converter::ToInstance .method public hidebysig static !!TType ToInstanceWithOffset<TType> ( native int input ) cil managed { // Method begins at RVA 0x2254 // Code size 7 (0x7) .maxstack 2 .locals init ( [0] native int CSS ) ldarg.0 ret } // end of method Converter::ToInstance } // end of class sandbox.Converter
      
      





рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ `System.Runtime.CLR.EntityPtr` рд╡рд░реНрдЧ рдЪрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ:






All Articles