рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ "рдХреНрдпреЛрдВ?" рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :) рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдЧрд░ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдФрд░ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SyncBlockIndex рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛, рдпрд╛ рдПрдХ MethodTable рд▓реЗрдирд╛ рдФрд░ рдЬрд╣рд╛рдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ, рдЙрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓реЗрдВред рдЖрдк рдкрд░рд╛рд╡рд░реНрддрди рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЫреЗрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдИ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдЦреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдЖрддреНрдо-рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдмрд╣рд░рд╣рд╛рд▓, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 1
рдЕрдиреБрд╕рдВрдзрд╛рди рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рдж рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рджреЛ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд░рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдХреЗ рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЙрдирдХрд╛ рд╕рдЯреАрдХ рд╕рдВрд░реЗрдЦрдг рд╕реЗрдЯ рдХрд░реЗрдВред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ?
- рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдХреЗрд▓рд╛ рд╣реЗрдбрд░ рд╣реИред
- рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдХреНрд╖реЗрддреНрд░ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рднреА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрдХреНрд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдСрдлрд╕реЗрдЯ рдкрд░ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗред
- рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╝реАрд▓реНрдбреНрд╕ рд╣реИрдВ, рддреЛ рдПрдХ рд╣реА рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (`[StructLayout (LayoutKind.explicit)]` рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдФрд░ `[FieldOffset (0)]` рдХреЛ рдЦреЗрддреЛрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░), рдЬрдмрдХрд┐ рдПрдХ рдХреЛ рд▓рд┐рдЦреЗрдВ рдЗрдирдореЗрдВ рд╕реЗ, рдХреБрдЫ рдХрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреЙрдЗрдВрдЯрд░ (рдлрд╝реАрд▓реНрдб рдСрдлрд╕реЗрдЯ рд╕рдорд╛рди рд╣реИ) рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИ, рд╣рдо рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд░реНрдЧ рд╣реИрдВ: `рдП` рдФрд░` рдмреА`, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, `рдП` рдХреЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб` рдСрдмреНрдЬреЗрдХреНрдЯ _рдлрд╝реАрд▓реНрдб` рд╣реИ, рдФрд░ рдХреНрд▓рд╛рд╕ `рдмреА` рдХреЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб` рдЗрдВрдЯ _рдлреАрд▓реНрдб` рд╣реИ, рддреЛ 32-рдмрд┐рдЯ рдкрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ `C`, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдСрдлрд╝рд╕реЗрдЯ рдореЗрдВ рдЯрд╛рдЗрдк` A` рдФрд░ `B` рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЖрдк рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкрддрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП` CA_field = рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ () `рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:` var address = CB_field`ред
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 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` рд╡рд░реНрдЧ рдЪрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ:
- IntPtr ToPointer (T рдСрдмреНрдЬреЗрдХреНрдЯ) - SyncBlockIndex рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (.Net рдореЗрдВ рд╕рдВрдХреЗрдд рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди SynclocklockIndex рдХреЗ рдмрд░рд╛рдмрд░ рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд╢рдмреНрдж рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░)ред
IntPtr ToPointerWithOffset (T рдСрдмреНрдЬреЗрдХреНрдЯ) - SyncBlockIndex рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдСрдлрд╕реЗрдЯ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
T Tostance (IntPtr рдкреЙрдЗрдВрдЯрд░) - рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╢рдмреНрдж рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (SyncBlockIndex)
T ToPointerWithOffset (IntPtr рдкреЙрдЗрдВрдЯрд░) - рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреЙрдЗрдВрдЯрд░ рд╢рдмреНрдж рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд┐рдП рдмрд┐рдирд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ (SyncBlockIndex)
рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдзрд┐ 1 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рд╕рд░рд▓ рд╣реИ:
var pointer = EntityPtr.ToPointer("Hello");
рдмрд╕ рдЗрддрдирд╛ рд╣реА!
рдирд┐рд╖реНрдХрд░реНрд╖
рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд╕реЗ, рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
- .Net рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛрдиреЛрдВ рддрдХрдиреАрдХ рдХреЗрд╡рд▓ рдлреБрд▓рдЯреНрд░рд╕реНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдпрджрд┐ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рджреМрд░рд╛рди рдЬреАрд╕реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдВрдкреАрдбрд╝рд┐рдд рд╣реЛрдЧреАред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░рд╛ рд╕реВрдЪрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реИрдз рд╣реЛрдиреЗ рд╕реЗ рдмрдЪ рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдирдХрд╛рд░рддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рдж рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдФрд░ рдирдП рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рдЯрди рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИред