Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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
- DocumentApplicationJournalEntry.cs
- Panel.cs
- RuntimeWrappedException.cs
- DataListItemCollection.cs
- BrowserCapabilitiesCodeGenerator.cs
- IndividualDeviceConfig.cs
- ToolStripControlHost.cs
- ImportContext.cs
- XmlSchemaSimpleContentExtension.cs
- OutputCacheModule.cs
- Thread.cs
- XmlSchemaCompilationSettings.cs
- AnnotationMap.cs
- DrawingBrush.cs
- Cursors.cs
- SmtpReplyReaderFactory.cs
- ListenerConnectionDemuxer.cs
- SystemColors.cs
- ConvertTextFrag.cs
- HierarchicalDataSourceDesigner.cs
- EdmEntityTypeAttribute.cs
- FullTextState.cs
- TagPrefixCollection.cs
- StorageBasedPackageProperties.cs
- QualifierSet.cs
- ColorTypeConverter.cs
- UIElement3D.cs
- UiaCoreTypesApi.cs
- MethodImplAttribute.cs
- WebEvents.cs
- VisualBrush.cs
- SqlTopReducer.cs
- safemediahandle.cs
- ShortcutKeysEditor.cs
- DataServiceConfiguration.cs
- AutomationElementCollection.cs
- HttpConfigurationContext.cs
- PartitionResolver.cs
- XDRSchema.cs
- MailWebEventProvider.cs
- Encoder.cs
- ControlCachePolicy.cs
- TCPClient.cs
- KnownTypes.cs
- NotCondition.cs
- ListViewAutomationPeer.cs
- SiteMapDesignerDataSourceView.cs
- ProfileService.cs
- Pkcs9Attribute.cs
- ToolboxComponentsCreatingEventArgs.cs
- BookmarkWorkItem.cs
- DataGridHeaderBorder.cs
- DbParameterHelper.cs
- XmlSignatureManifest.cs
- RangeValidator.cs
- TextEditorDragDrop.cs
- TextEditorCharacters.cs
- XmlDictionaryReaderQuotas.cs
- PropertyTabChangedEvent.cs
- Thumb.cs
- DeclarativeCatalogPart.cs
- TraceHwndHost.cs
- DocumentApplicationJournalEntry.cs
- SimpleApplicationHost.cs
- WebPartCancelEventArgs.cs
- ArrayEditor.cs
- XmlParser.cs
- CodeBinaryOperatorExpression.cs
- HandledEventArgs.cs
- HScrollProperties.cs
- CommonGetThemePartSize.cs
- DetailsViewActionList.cs
- Types.cs
- PropertyMap.cs
- WebDescriptionAttribute.cs
- DoubleAnimation.cs
- WebHttpDispatchOperationSelector.cs
- AccessText.cs
- StateMachine.cs
- Type.cs
- SQLResource.cs
- AppDomainInfo.cs
- ToolStripGripRenderEventArgs.cs
- TemplateControl.cs
- Brush.cs
- EdmType.cs
- RuntimeConfig.cs
- ProfileEventArgs.cs
- GenericTextProperties.cs
- TableLayoutSettings.cs
- GlyphTypeface.cs
- CollectionBuilder.cs
- InputLanguageCollection.cs
- Animatable.cs
- TransformGroup.cs
- OperationContextScope.cs
- NamespaceInfo.cs
- XmlWrappingReader.cs
- AsyncOperationLifetimeManager.cs
- WindowsRegion.cs