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
- ArraySubsetEnumerator.cs
- OpacityConverter.cs
- UnmanagedMemoryStream.cs
- TreeNodeSelectionProcessor.cs
- FontUnit.cs
- ScriptDescriptor.cs
- WebPartConnectionsCancelEventArgs.cs
- Region.cs
- GZipStream.cs
- ExecutionEngineException.cs
- AngleUtil.cs
- MessagePropertyVariants.cs
- InternalsVisibleToAttribute.cs
- MouseWheelEventArgs.cs
- HttpValueCollection.cs
- SqlDataSourceEnumerator.cs
- Hashtable.cs
- XamlReaderHelper.cs
- XmlHelper.cs
- Normalization.cs
- ToolStripDropDown.cs
- Action.cs
- Activator.cs
- X509CertificateClaimSet.cs
- mediapermission.cs
- MouseActionValueSerializer.cs
- DynamicPropertyReader.cs
- QilReference.cs
- ParameterBuilder.cs
- TableRow.cs
- XmlSchemaObject.cs
- StringSorter.cs
- StylusButtonEventArgs.cs
- SBCSCodePageEncoding.cs
- AnimationException.cs
- HandlerFactoryCache.cs
- Collection.cs
- ResXBuildProvider.cs
- HttpProfileGroupBase.cs
- HttpRawResponse.cs
- AnonymousIdentificationSection.cs
- XamlBuildProvider.cs
- ContextBase.cs
- ByteFacetDescriptionElement.cs
- XmlSchemaObjectTable.cs
- RestHandler.cs
- SqlCacheDependency.cs
- TypeCacheManager.cs
- DrawingState.cs
- ScriptResourceDefinition.cs
- QueryComponents.cs
- DocumentApplicationJournalEntry.cs
- RealizationContext.cs
- RtfControls.cs
- GPRECT.cs
- DbCommandTree.cs
- TextSchema.cs
- ArraySortHelper.cs
- XmlNavigatorFilter.cs
- ObjectMemberMapping.cs
- WindowsFormsSynchronizationContext.cs
- ControlAdapter.cs
- VarRemapper.cs
- CodeEventReferenceExpression.cs
- StreamResourceInfo.cs
- SamlNameIdentifierClaimResource.cs
- SqlCharStream.cs
- MachineKeySection.cs
- DownloadProgressEventArgs.cs
- SafeWaitHandle.cs
- EntityClientCacheKey.cs
- Utils.cs
- ClientSponsor.cs
- DiscardableAttribute.cs
- XmlSchemaAnyAttribute.cs
- ExpressionVisitor.cs
- BaseDataBoundControl.cs
- PlainXmlWriter.cs
- MTConfigUtil.cs
- SqlCacheDependency.cs
- coordinator.cs
- EventManager.cs
- ListViewSelectEventArgs.cs
- SessionPageStateSection.cs
- MouseOverProperty.cs
- CodeEventReferenceExpression.cs
- CachedTypeface.cs
- GridViewRowCollection.cs
- ReliabilityContractAttribute.cs
- DynamicAttribute.cs
- ToolboxComponentsCreatedEventArgs.cs
- ListViewGroup.cs
- FlatButtonAppearance.cs
- PreservationFileReader.cs
- RuleSetDialog.Designer.cs
- CanonicalFormWriter.cs
- TraceSource.cs
- listitem.cs
- FactoryId.cs
- MailWebEventProvider.cs