Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / 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
- FileLoadException.cs
- PerformanceCounterPermissionAttribute.cs
- FontClient.cs
- SiteMap.cs
- Funcletizer.cs
- SimpleType.cs
- MailWriter.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- UIElement.cs
- ImageFormatConverter.cs
- HtmlTernaryTree.cs
- DataFormat.cs
- XmlSerializationReader.cs
- HostingPreferredMapPath.cs
- CompilerTypeWithParams.cs
- DefaultPrintController.cs
- FormsAuthenticationTicket.cs
- WinCategoryAttribute.cs
- WCFModelStrings.Designer.cs
- PropertyTabChangedEvent.cs
- Roles.cs
- ColorComboBox.cs
- ProfileGroupSettings.cs
- EntitySqlQueryCacheEntry.cs
- HierarchicalDataBoundControl.cs
- ChannelToken.cs
- XmlReader.cs
- CompilerErrorCollection.cs
- ButtonChrome.cs
- IncomingWebRequestContext.cs
- ControlPersister.cs
- InputScopeConverter.cs
- HwndKeyboardInputProvider.cs
- AccessDataSource.cs
- OdbcUtils.cs
- TypedTableBase.cs
- ThemeDictionaryExtension.cs
- GridViewRowCollection.cs
- HandledEventArgs.cs
- RuntimeEnvironment.cs
- HtmlGenericControl.cs
- PrinterResolution.cs
- XmlStreamStore.cs
- Listbox.cs
- OpenTypeLayoutCache.cs
- MeasurementDCInfo.cs
- RefType.cs
- OrderedDictionary.cs
- WorkBatch.cs
- PageBreakRecord.cs
- EntityViewContainer.cs
- Constraint.cs
- COM2TypeInfoProcessor.cs
- SqlBuilder.cs
- ButtonBase.cs
- DesignerDataParameter.cs
- RemotingConfiguration.cs
- CompareInfo.cs
- ConfigDefinitionUpdates.cs
- AvTrace.cs
- ComponentCache.cs
- XmlSchemaException.cs
- Base64Encoder.cs
- GlyphShapingProperties.cs
- UnsafeNativeMethodsPenimc.cs
- VirtualPathUtility.cs
- CollectionViewGroupRoot.cs
- Utilities.cs
- PasswordTextNavigator.cs
- PriorityChain.cs
- X509ChainPolicy.cs
- SizeFConverter.cs
- MessageHeaderException.cs
- IndexedSelectQueryOperator.cs
- QilVisitor.cs
- ReflectionTypeLoadException.cs
- HtmlControl.cs
- MgmtConfigurationRecord.cs
- ConnectionInterfaceCollection.cs
- DataViewSetting.cs
- Latin1Encoding.cs
- ExpressionBuilderCollection.cs
- PackWebResponse.cs
- FillBehavior.cs
- BeginStoryboard.cs
- EncoderParameter.cs
- WebServiceReceiveDesigner.cs
- TypeLoadException.cs
- _ConnectOverlappedAsyncResult.cs
- PixelFormats.cs
- Fonts.cs
- HandlerBase.cs
- MouseGestureValueSerializer.cs
- WindowsStatic.cs
- CompoundFileDeflateTransform.cs
- TextTreeUndoUnit.cs
- MailAddress.cs
- SQLDoubleStorage.cs
- Int32.cs
- Misc.cs