рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдкреИрдЯрд░реНрди (рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдбрд┐рдЬрд╛рдЗрди рд╕рд┐рджреНрдзрд╛рдВрдд) рдкреАрдЯреАред 2


рд╕реЗрдлрд╣реИрдВрдбрд▓ / рдХреНрд░рд┐рдЯрд┐рдХрд▓рд╣реИрдВрдбрд▓ / рд╕реЗрдлрдмрдлрд╝рд░ / рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рднрд╛рдиреБрдорддреА рдХрд╛ рдкрд┐рдЯрд╛рд░рд╛ рдЦреЛрд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдЪрд▓реЛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ: рд╕реЗрдлрд╣реИрдВрдбрд▓, рдХреНрд░рд┐рдЯрд┐рдХрд▓рд╣реИрдВрдбрд▓ рдФрд░ рдЙрдирдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ред


рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдмрд╛рдд рд╣реИ рдЬреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЙрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдЬреЛ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рджреБрдирд┐рдпрд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:


рдкрд╣рд▓реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рд╣реИрдВрдбрд▓ рд╣реИред рдпрд╣ .NET рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд░реНрдерд╣реАрди рд╢рдмреНрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рджреБрдирд┐рдпрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХ рд╣реИред рдПрдХ рд╣реИрдВрдбрд▓ рдкреНрд░рдХреГрддрд┐ рджреНрд╡рд╛рд░рд╛ рдПрдХ 32- рдпрд╛ 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╛ рдПрдХ рдЦреБрд▓рд╛ рд╕рддреНрд░ рдирд╛рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ WinApi рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╣реИрдВрдбрд▓ рдорд┐рд▓рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдСрдкрд░реЗрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╛, рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЛ рдПрдХ рд╣реИрдВрдбрд▓ рджреЗрдЧрд╛ред .NET рд╣реИрдВрдбрд▓ рдореЗрдВ IntPtr рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;


рдпрд╣ рдЕрдзреНрдпрд╛рдп рд░реВрд╕реА рд╕реЗ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдкреЗрд╢реЗрд╡рд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдк рд░реВрд╕реА рдпрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЦреНрдпрддрдГ рдЪреАрдиреА рдпрд╛ рдЬрд░реНрдорди рдореЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╣рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЧрд┐рддреБрдм рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗрдирд╛ рд╣реИ рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдирд╛ рд╣реИ github / sidristij / dotnetbook ред

  • рджреВрд╕рд░реА рдмрд╛рдд рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИред рдЖрдк рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдпрд╣рд╛рдВ рдПрдХ рдкреНрд░рдореБрдЦ рд╢рдмреНрдж рд╣реИ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ рддреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ SafeBuffer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛ рдмрдлрд░ рдХреЛ рдПрдХ рдЙрдкрдпреБрдХреНрдд .NET рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рдкреЗрдЯ рджреЗрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рддреЗрдЬрд╝ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓реВрдк рдХреЛ рдмрд╣реБрдд рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рджреВрд╕рд░рд╛ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реЗрдлрд╣реИрдВрдбрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ;
  • рдлрд┐рд░ рддрд╛рд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕рд░рд▓ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рддрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд░реНрдЧ рд╣реИ) рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • рдЖрдЦрд┐рд░реА рдЪреАрдЬ рд╣реИ ValueTypes рдЬреЛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХреЙрдкреА рдХреА рдЬрд╛рддреА рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рд╕реЗрдлрд╣реИрдВрдбрд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ .NET рд╕реАрдПрд▓рдЖрд░ рдХреНрд▓рд╛рд╕ рд╣реИ рдЬреЛ рдХреНрд░рд┐рдЯрд┐рдХрд▓ рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рд░рдСрдмрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╣реИрдВрдбрд▓ рдХреЛ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕рдмрд╕реЗ рдЖрд░рд╛рдорджрд╛рдпрдХ рддрд░реАрдХреЗ рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред


[SecurityCritical, SecurityPermission(SecurityAction.InheritanceDemand, UnmanagedCode=true)] public abstract class SafeHandle : CriticalFinalizerObject, IDisposable { protected IntPtr handle; // The handle from OS private int _state; // State (validity, the reference counter) private bool _ownsHandle; // The flag for the possibility to release the handle. // It may happen that we wrap somebody else's handle // have no right to release. private bool _fullyInitialized; // The initialized instance [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] protected SafeHandle(IntPtr invalidHandleValue, bool ownsHandle) { } // The finalizer calls Dispose(false) with a pattern [SecuritySafeCritical] ~SafeHandle() { Dispose(false); } // You can set a handle manually or automatically with p/invoke Marshal [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] protected void SetHandle(IntPtr handle) { this.handle = handle; } // This method is necessary to work with IntPtr directly. It is used to // determine if a handle was created by comparing it with one of the previously // determined known values. Pay attention that this method is dangerous because: // // тАУ if a handle is marked as invalid by SetHandleasInvalid, DangerousGetHandle // it will anyway return the original value of the handle. // тАУ you can reuse the returned handle at any place. This can at least // mean, that it will stop work without a feedback. In the worst case if // IntPtr is passed directly to another place, it can go to an unsafe code and become // a vector for application attack by resource substitution in one IntPtr [ResourceExposure(ResourceScope.None), ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public IntPtr DangerousGetHandle() { return handle; } // The resource is closed (no more available for work) public bool IsClosed { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get { return (_state & 1) == 1; } } // The resource is not available for work. You can override the property by changing the logic. public abstract bool IsInvalid { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get; } // Closing the resource through Close() pattern [SecurityCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public void Close() { Dispose(true); } // Closing the resource through Dispose() pattern [SecuritySafeCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public void Dispose() { Dispose(true); } [SecurityCritical, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] protected virtual void Dispose(bool disposing) { // ... } // You should call this method every time when you understand that a handle is not operational anymore. // If you don't do it, you can get a leak. [SecurityCritical, ResourceExposure(ResourceScope.None)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern void SetHandleAsInvalid(); // Override this method to point how to release // the resource. You should code carefully, as you cannot // call uncompiled methods, create new objects or produce exceptions from it. // A returned value shows if the resource was releases successfully. // If a returned value = false, SafeHandleCriticalFailure will occur // that will enter a breakpoint if SafeHandleCriticalFailure // Managed Debugger Assistant is activated. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] protected abstract bool ReleaseHandle(); // Working with the reference counter. To be explained further. [SecurityCritical, ResourceExposure(ResourceScope.None)] [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] [MethodImplAttribute(MethodImplOptions.InternalCall)] public extern void DangerousAddRef(ref bool success); public extern void DangerousRelease(); } 

рд╕реЗрдлрд╝рд╣реИрдВрдбрд▓ рд╕реЗ рд▓реА рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ .NET рдкреНрд░рдХрд╛рд░ рдЗрддрдиреЗ рдорд╣рд╛рди рдХреНрдпреЛрдВ рд╣реИрдВ: GC рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рд╕реЗрдлрд╣реИрдВрдбрд▓ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рд▓рдкреЗрдЯреЗ рд╣реБрдП рд╕рдВрд╕рд╛рдзрди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рджреБрдирд┐рдпрд╛ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдмрд╛рд╣рд░реА рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдХрд╛рдЙрдВрдЯрд░ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕реАрдПрд▓рдЖрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд╕реЗ рд╣реИред рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдиреЗ рдпрд╛ рдШрдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рд╕реЗ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпреБрддреНрдкрдиреНрди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдЙрдВрдЯрд░ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ рдпрд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдШрдЯ рдЬрд╛рддреА рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдПрдХ рд╣реИрдВрдбрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк GC рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░рд┐рдд рдХрд┐рдП рдЧрдП рдЗрд╕ SafeHandle рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рдЗрд╕ рд╣реИрдВрдбрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдХреЗ (рдпрджрд┐ рдЖрдк рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВрдбрд▓ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдЪреАрдЬреЗрдВ рдФрд░ рднреА рдЖрд╕рд╛рди рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ: рд╕реЗрдлрд╣реИрдВрдбрд▓ рддрдм рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рди рд╣реЛ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдЙрдВрдЯрд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╛, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╕рдВрднрд╡ рд╣реЛред


рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рджреВрд╕рд░рд╛ рдЙрджреНрджреЗрд╢реНрдп CriticalFinalizerObject рдлрд╝рд╛рдЗрдирд▓рд╛рдЗрдЬрд╝рд░рдСрдмрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХрд╛ рдХреНрд░рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ SafeHandle- рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд░рд┐рд▓реАрдЬрд╝рд╣реИрдВрдбрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреА рд╡рд╕реНрддреБ рддрдм рддрдХ рдореМрдЬреВрдж рд░рд╣реЗрдЧреА рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реА рдкрд╣реЗрд▓рд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЖрдЗрдП рд╕реЗрдлрд╣реИрдВрдбрд▓рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВ:


 public class FileWrapper : IDisposable { SafeFileHandle _handle; bool _disposed; public FileWrapper(string name) { _handle = CreateFile(name, 0, 0, 0, 0, 0, IntPtr.Zero); } public void Dispose() { if(_disposed) return; _disposed = true; _handle.Dispose(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void CheckDisposed() { if(_disposed) { throw new ObjectDisposedException(); } } [DllImport("kernel32.dll", EntryPoint = "CreateFile", SetLastError = true)] private static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode, IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); /// other methods } 

рдпрд╣ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИ? рдпрджрд┐ рдЖрдк DllImport рдореЗрдердб рдореЗрдВ рдХрд┐рд╕реА рднреА SafeHandle- рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ (рдЕрдкрдиреЗ рд╕рд╣рд┐рдд) рдХреЛ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рд░реНрд╢рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛ред 1. рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо SafeFileHportle рдкреНрд░рдХрд╛рд░ рдХреЛ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред CreateFile рдХрд░реНрдиреЗрд▓ рдлрд╝рдВрдХреНрд╢рдиред рдЬрдм рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд░реАрдбрд╛рдЗрд▓ рдФрд░ рд░рд╛рдЗрдЯрдлрд╛рдЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ (рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВ рд╡реГрджреНрдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣реИрдВрдбрд▓ рдЕрднреА рднреА рдлрд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдореМрдЬреВрдж рд╣реИ)ред рдпрд╣ рдПрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдереНрд░реЗрдб рдХреЗ рдЧрд░реНрднрдкрд╛рдд рд╣реЛрдиреЗ рдкрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╛рдЗрдирд▓ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣рд░ рдЪреАрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреВрд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдПрдХ рдЕрдВрддрд┐рдо рдирд┐рд╖реНрдкрд╛рджрди рдЬрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ


рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕реЗ рдХрдо рд╕рдордп рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рджреЗрдЦреЗрдВ:


 public void SampleMethod() { var obj = new object(); obj.ToString(); // ... // If GC runs at this point, it may collect obj // as it is not used anymore // ... Console.ReadLine(); } 

рдПрдХ рдУрд░, рдХреЛрдб рд╕реБрд░рдХреНрд╖рд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпреЛрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддреА рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдЧ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рджреБрдирд┐рдпрд╛ рд╕реЗ рдЕрдкрд╡рд╛рдж рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдкрд╡рд╛рдж рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛ рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рд╣реИрдВрдбрд▓ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИ:


 // The example of an absolutely incorrect implementation void Main() { var inst = new SampleClass(); inst.ReadData(); // inst is not used further } public sealed class SampleClass : CriticalFinalizerObject, IDisposable { private IntPtr _handle; public SampleClass() { _handle = CreateFile("test.txt", 0, 0, IntPtr.Zero, 0, 0, IntPtr.Zero); } public void Dispose() { if (_handle != IntPtr.Zero) { CloseHandle(_handle); _handle = IntPtr.Zero; } } ~SampleClass() { Console.WriteLine("Finalizing instance."); Dispose(); } public unsafe void ReadData() { Console.WriteLine("Calling GC.Collect..."); // I redirected it to the local variable not to // use this after GC.Collect(); var handle = _handle; // The imitation of full GC.Collect GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Console.WriteLine("Finished doing something."); var overlapped = new NativeOverlapped(); // it is not important what we do ReadFileEx(handle, new byte[] { }, 0, ref overlapped, (a, b, c) => {;}); } [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto, BestFitMapping = false)] static extern IntPtr CreateFile(String lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr securityAttrs, int dwCreationDisposition, int dwFlagsAndAttributes, IntPtr hTemplateFile); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadFileEx(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, [In] ref NativeOverlapped lpOverlapped, IOCompletionCallback lpCompletionRoutine); [DllImport("kernel32.dll", SetLastError = true)] static extern bool CloseHandle(IntPtr hObject); } 

рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рднреНрдп рджрд┐рдЦрддрд╛ рд╣реИред рд╡реИрд╕реЗ рднреА, рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╛рдЗрдирд▓рд░ рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╣реБрдП рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдИ рд╣реИ ( IntPtr == -1 ) рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред _handle рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдирд┐рдореНрди Dispose рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди рд▓реАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ SafeHandle , CriticalHandle , SafeBuffer рдФрд░ рдЙрдирдХреЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рд╣реИрдВ, рдЗрди рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрдм рдЕрдкреНрд░рдмрдВрдзрд┐рдд рджреБрдирд┐рдпрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдкрд░ рдЧрд┐рд░рд╛рд╡рдЯ рд╣реЛрддреА рд╣реИред


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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк "рдзрдиреНрдпрд╡рд╛рдж" рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЬреЛ рдЖрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣рдореЗрдВ рдЬреАрдердм рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдПрдХ рд╕реНрдЯрд╛рд░ рджреЗ рд░рд╣рд╛ рд╣реИред https://github.com/sidristij/dotnetbook

Source: https://habr.com/ru/post/hi443960/


All Articles