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
- LinkUtilities.cs
- RoleServiceManager.cs
- MetadataSource.cs
- Separator.cs
- Signature.cs
- TranslateTransform3D.cs
- InternalPermissions.cs
- ApplicationHost.cs
- relpropertyhelper.cs
- DbParameterCollection.cs
- xsdvalidator.cs
- MetadataArtifactLoaderComposite.cs
- AppliedDeviceFiltersEditor.cs
- ToolStripItemEventArgs.cs
- ApplicationSecurityInfo.cs
- ExtendedProperty.cs
- UrlSyndicationContent.cs
- Win32Native.cs
- RSACryptoServiceProvider.cs
- GotoExpression.cs
- ListDictionaryInternal.cs
- Convert.cs
- LightweightEntityWrapper.cs
- DesignTimeParseData.cs
- Point.cs
- Buffer.cs
- EncryptionUtility.cs
- DesignerOptionService.cs
- CursorInteropHelper.cs
- SharedTcpTransportManager.cs
- RankException.cs
- Authorization.cs
- WebRequest.cs
- RadioButton.cs
- EditingCommands.cs
- ManifestResourceInfo.cs
- MultiTrigger.cs
- FileDataSource.cs
- TypeSchema.cs
- ExtensibleClassFactory.cs
- MetadataExchangeClient.cs
- EditorPartChrome.cs
- EventEntry.cs
- PagesSection.cs
- ClaimTypes.cs
- NativeMethods.cs
- QilStrConcat.cs
- XamlReaderHelper.cs
- SafeFileMappingHandle.cs
- SerialReceived.cs
- ContainerSelectorActiveEvent.cs
- AggregateNode.cs
- BindingManagerDataErrorEventArgs.cs
- UpdatableGenericsFeature.cs
- StaticExtension.cs
- DesignConnection.cs
- Pts.cs
- Context.cs
- ToolStripGripRenderEventArgs.cs
- SimpleBitVector32.cs
- FamilyTypeface.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- RowParagraph.cs
- CngProperty.cs
- SystemTcpConnection.cs
- StorageEndPropertyMapping.cs
- SmtpException.cs
- RectangleGeometry.cs
- StyleModeStack.cs
- DataGridViewCellFormattingEventArgs.cs
- Ray3DHitTestResult.cs
- RepeaterItemEventArgs.cs
- PerformanceCounterManager.cs
- BindingContext.cs
- Lazy.cs
- InputLanguageCollection.cs
- ProfileProvider.cs
- XmlAttribute.cs
- DefaultValueAttribute.cs
- ProcessProtocolHandler.cs
- IndexExpression.cs
- NCryptSafeHandles.cs
- MetafileHeader.cs
- DesignerAutoFormatCollection.cs
- DataGridViewIntLinkedList.cs
- HwndAppCommandInputProvider.cs
- DesignerDataView.cs
- JapaneseCalendar.cs
- TargetInvocationException.cs
- EdmScalarPropertyAttribute.cs
- PointLight.cs
- TextCompositionManager.cs
- EventLogger.cs
- RectangleHotSpot.cs
- PreloadedPackages.cs
- ProtocolViolationException.cs
- TraceHandler.cs
- DiscreteKeyFrames.cs
- DataGridViewColumn.cs
- MessageDecoder.cs