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
- DataServiceKeyAttribute.cs
- Stack.cs
- DBConcurrencyException.cs
- DateTimeValueSerializer.cs
- MembershipSection.cs
- VerticalAlignConverter.cs
- ObjectComplexPropertyMapping.cs
- DataGridSortCommandEventArgs.cs
- VisualCollection.cs
- SoapInteropTypes.cs
- ParagraphResult.cs
- BitmapEffect.cs
- UnsafeNativeMethodsMilCoreApi.cs
- WebPartTracker.cs
- ApplicationSettingsBase.cs
- Underline.cs
- DataGridViewElement.cs
- CompressEmulationStream.cs
- ReferencedType.cs
- DataGridViewTextBoxEditingControl.cs
- PrintingPermissionAttribute.cs
- BaseTypeViewSchema.cs
- SoapAttributeAttribute.cs
- dsa.cs
- DescendentsWalkerBase.cs
- MimePart.cs
- TreeViewCancelEvent.cs
- Buffer.cs
- FileDialogCustomPlacesCollection.cs
- UInt64Storage.cs
- CipherData.cs
- ScopelessEnumAttribute.cs
- FloaterParagraph.cs
- IgnoreSection.cs
- ProjectionPathSegment.cs
- AdRotatorDesigner.cs
- StreamReader.cs
- SQLInt64Storage.cs
- SectionXmlInfo.cs
- EdmConstants.cs
- HitTestParameters.cs
- WebPartCollection.cs
- StructuredTypeEmitter.cs
- SqlBulkCopyColumnMapping.cs
- SmiSettersStream.cs
- VisualStyleInformation.cs
- AncestorChangedEventArgs.cs
- WebPartConnectionsConfigureVerb.cs
- SqlCacheDependencyDatabaseCollection.cs
- AuthenticationModuleElementCollection.cs
- KeyedHashAlgorithm.cs
- FastPropertyAccessor.cs
- Version.cs
- DBBindings.cs
- FileUpload.cs
- JsonQNameDataContract.cs
- ResetableIterator.cs
- SpoolingTaskBase.cs
- DbDataReader.cs
- DataGridViewRowsRemovedEventArgs.cs
- MetadataCache.cs
- CodeConditionStatement.cs
- FormViewUpdateEventArgs.cs
- ConfigurationUtility.cs
- ObjectDataSource.cs
- ControlLocalizer.cs
- EntityKey.cs
- QueryInterceptorAttribute.cs
- WindowsListViewScroll.cs
- DataGridRelationshipRow.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- SqlNodeTypeOperators.cs
- ITreeGenerator.cs
- RemotingException.cs
- SiteIdentityPermission.cs
- CodeTypeMemberCollection.cs
- Cursors.cs
- ByteAnimationBase.cs
- NetworkInformationException.cs
- WinEventTracker.cs
- HttpRuntimeSection.cs
- DoubleKeyFrameCollection.cs
- ErrorWrapper.cs
- RenderDataDrawingContext.cs
- DataListGeneralPage.cs
- SoapFormatter.cs
- DataGridPageChangedEventArgs.cs
- Pipe.cs
- QueryLifecycle.cs
- DynamicMethod.cs
- StorageModelBuildProvider.cs
- _ListenerRequestStream.cs
- FixedSOMTableCell.cs
- FunctionImportMapping.cs
- PerspectiveCamera.cs
- UnsafeNativeMethods.cs
- TreeNodeClickEventArgs.cs
- InkCanvas.cs
- HTTPNotFoundHandler.cs
- DataGridViewCellStyleChangedEventArgs.cs