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
- hresults.cs
- CustomLineCap.cs
- _ListenerAsyncResult.cs
- UpdateInfo.cs
- AdjustableArrowCap.cs
- FileUpload.cs
- BinaryMethodMessage.cs
- MaskedTextProvider.cs
- WebResourceAttribute.cs
- OptimizerPatterns.cs
- IDispatchConstantAttribute.cs
- AdornerPresentationContext.cs
- TreeNodeStyleCollection.cs
- StylusPlugin.cs
- CodeSnippetTypeMember.cs
- Separator.cs
- DesignUtil.cs
- UIPermission.cs
- CollectionViewGroup.cs
- EmptyEnumerator.cs
- TemplateParser.cs
- XmlSchemaFacet.cs
- SBCSCodePageEncoding.cs
- LogEntrySerializer.cs
- CodeDomConfigurationHandler.cs
- ISAPIApplicationHost.cs
- BamlResourceSerializer.cs
- ObjectResult.cs
- SqlOuterApplyReducer.cs
- ExpressionBuilderCollection.cs
- PageThemeBuildProvider.cs
- QueryOperator.cs
- CodeNamespaceCollection.cs
- TypeContext.cs
- ModelUIElement3D.cs
- FontConverter.cs
- GridViewColumn.cs
- StringSorter.cs
- AssemblyBuilderData.cs
- SeverityFilter.cs
- AppDomain.cs
- ColumnWidthChangedEvent.cs
- sqlmetadatafactory.cs
- KeyedHashAlgorithm.cs
- GrammarBuilderBase.cs
- DataGridViewSelectedColumnCollection.cs
- DbProviderSpecificTypePropertyAttribute.cs
- FunctionQuery.cs
- PopupRootAutomationPeer.cs
- BitmapFrameDecode.cs
- RegistryHandle.cs
- LinqDataSourceContextEventArgs.cs
- EventHandlingScope.cs
- EmbeddedMailObject.cs
- XmlSchemaAttributeGroup.cs
- IssuedTokenClientElement.cs
- PropertyMap.cs
- EventMetadata.cs
- DBDataPermissionAttribute.cs
- ForeignKeyConstraint.cs
- CultureInfoConverter.cs
- VideoDrawing.cs
- HMACRIPEMD160.cs
- QueryOutputWriter.cs
- DES.cs
- EnlistmentTraceIdentifier.cs
- XPathSingletonIterator.cs
- Keyboard.cs
- DeviceSpecificChoice.cs
- ConsumerConnectionPointCollection.cs
- LinkTarget.cs
- XmlSchemaCompilationSettings.cs
- UserControlCodeDomTreeGenerator.cs
- DefaultWorkflowTransactionService.cs
- DataGridLinkButton.cs
- ListItemParagraph.cs
- WebControlsSection.cs
- StringDictionary.cs
- RadialGradientBrush.cs
- Sentence.cs
- WsatStrings.cs
- FormsAuthenticationEventArgs.cs
- UnlockInstanceCommand.cs
- XPathScanner.cs
- configsystem.cs
- ParamArrayAttribute.cs
- ReceiveDesigner.xaml.cs
- PropertySourceInfo.cs
- DataSvcMapFileSerializer.cs
- Errors.cs
- MessageFault.cs
- FontClient.cs
- ServiceEndpointElement.cs
- MatrixAnimationUsingKeyFrames.cs
- XmlProcessingInstruction.cs
- EmptyWorkItem.cs
- DrawingImage.cs
- EdgeProfileValidation.cs
- JsonObjectDataContract.cs
- JumpPath.cs