Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / IO / PinnedBufferMemoryStream.cs / 1 / PinnedBufferMemoryStream.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: PinnedBufferMemoryStream ** ** ** Purpose: Pins a byte[], exposing it as an unmanaged memory ** stream. Used in ResourceReader for corner cases. ** ** ===========================================================*/ using System; using System.Runtime.InteropServices; namespace System.IO { internal sealed unsafe class PinnedBufferMemoryStream : UnmanagedMemoryStream { private byte[] _array; private GCHandle _pinningHandle; internal PinnedBufferMemoryStream(byte[] array) { BCLDebug.Assert(array != null, "Array can't be null"); int len = array.Length; // Handle 0 length byte arrays specially. if (len == 0) { array = new byte[1]; len = 0; } _array = array; _pinningHandle = new GCHandle(array, GCHandleType.Pinned); // Now the byte[] is pinned for the lifetime of this instance. // But I also need to get a pointer to that block of memory... fixed(byte* ptr = _array) Initialize(ptr, len, len, FileAccess.Read, true); } ~PinnedBufferMemoryStream() { Dispose(false); } protected override void Dispose(bool disposing) { if (_isOpen) { _pinningHandle.Free(); _isOpen = false; } #if _DEBUG // To help track down lifetime issues on checked builds, force //a full GC here. if (disposing) { GC.Collect(); GC.WaitForPendingFinalizers(); } #endif base.Dispose(disposing); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: PinnedBufferMemoryStream ** ** ** Purpose: Pins a byte[], exposing it as an unmanaged memory ** stream. Used in ResourceReader for corner cases. ** ** ===========================================================*/ using System; using System.Runtime.InteropServices; namespace System.IO { internal sealed unsafe class PinnedBufferMemoryStream : UnmanagedMemoryStream { private byte[] _array; private GCHandle _pinningHandle; internal PinnedBufferMemoryStream(byte[] array) { BCLDebug.Assert(array != null, "Array can't be null"); int len = array.Length; // Handle 0 length byte arrays specially. if (len == 0) { array = new byte[1]; len = 0; } _array = array; _pinningHandle = new GCHandle(array, GCHandleType.Pinned); // Now the byte[] is pinned for the lifetime of this instance. // But I also need to get a pointer to that block of memory... fixed(byte* ptr = _array) Initialize(ptr, len, len, FileAccess.Read, true); } ~PinnedBufferMemoryStream() { Dispose(false); } protected override void Dispose(bool disposing) { if (_isOpen) { _pinningHandle.Free(); _isOpen = false; } #if _DEBUG // To help track down lifetime issues on checked builds, force //a full GC here. if (disposing) { GC.Collect(); GC.WaitForPendingFinalizers(); } #endif base.Dispose(disposing); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Bits.cs
- Camera.cs
- EUCJPEncoding.cs
- SamlAssertionKeyIdentifierClause.cs
- MappingMetadataHelper.cs
- CodeAssignStatement.cs
- Baml2006ReaderContext.cs
- TypeLibraryHelper.cs
- ReadOnlyAttribute.cs
- TextBox.cs
- GeometryGroup.cs
- BaseDataBoundControl.cs
- LayoutEngine.cs
- DescriptionAttribute.cs
- TaskForm.cs
- TypedTableBase.cs
- WindowsFormsLinkLabel.cs
- ProfileModule.cs
- MarkedHighlightComponent.cs
- XXXInfos.cs
- SecurityElement.cs
- FontInfo.cs
- SamlAuthorizationDecisionStatement.cs
- AccessDataSourceView.cs
- StyleCollection.cs
- HwndAppCommandInputProvider.cs
- HostedHttpTransportManager.cs
- Graphics.cs
- ImageList.cs
- FrameworkElementAutomationPeer.cs
- PackageDocument.cs
- X509SecurityTokenAuthenticator.cs
- RegistrySecurity.cs
- BrowserCapabilitiesFactory.cs
- SafeUserTokenHandle.cs
- ConfigXmlAttribute.cs
- NotifyInputEventArgs.cs
- UdpRetransmissionSettings.cs
- ActivityLocationReferenceEnvironment.cs
- BitmapPalettes.cs
- DataGridViewRowHeightInfoPushedEventArgs.cs
- StyleHelper.cs
- Pen.cs
- CompilationAssemblyInstallComponent.cs
- NodeFunctions.cs
- GraphicsPathIterator.cs
- NativeMethods.cs
- MissingFieldException.cs
- BamlResourceDeserializer.cs
- SelfIssuedAuthProofToken.cs
- PartitionedDataSource.cs
- ByteKeyFrameCollection.cs
- RMEnrollmentPage1.cs
- TextControlDesigner.cs
- ConsumerConnectionPointCollection.cs
- cache.cs
- QuadraticBezierSegment.cs
- WindowsIdentity.cs
- RequestSecurityToken.cs
- ManipulationDelta.cs
- TextComposition.cs
- ListItemConverter.cs
- LinqDataSourceUpdateEventArgs.cs
- AppSettingsExpressionBuilder.cs
- OneOfElement.cs
- SafePEFileHandle.cs
- DurableTimerExtension.cs
- HostProtectionPermission.cs
- EdmError.cs
- DataKeyCollection.cs
- RoleGroup.cs
- SocketManager.cs
- WithParamAction.cs
- RightsManagementEncryptionTransform.cs
- TextFragmentEngine.cs
- ReliableChannelListener.cs
- ForeignConstraint.cs
- HtmlElementCollection.cs
- _Events.cs
- FileUpload.cs
- StringComparer.cs
- StagingAreaInputItem.cs
- UnsafeNativeMethods.cs
- HttpServerProtocol.cs
- WeakEventManager.cs
- PlainXmlWriter.cs
- AsyncStreamReader.cs
- CompilerCollection.cs
- ErrorFormatter.cs
- CreateDataSourceDialog.cs
- AVElementHelper.cs
- HtmlCalendarAdapter.cs
- ActivityLocationReferenceEnvironment.cs
- FacetChecker.cs
- UnmanagedMarshal.cs
- DataGridViewEditingControlShowingEventArgs.cs
- TextFormatterContext.cs
- SpeechEvent.cs
- Int64Storage.cs
- ImageClickEventArgs.cs