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
- ProcessModule.cs
- ObjectDataSourceView.cs
- SignatureDescription.cs
- HttpRequest.cs
- CommandTreeTypeHelper.cs
- DefaultExpression.cs
- ToolStripSeparatorRenderEventArgs.cs
- TemplateInstanceAttribute.cs
- FigureParagraph.cs
- CompilerInfo.cs
- KeyPressEvent.cs
- ResourceDisplayNameAttribute.cs
- LinearKeyFrames.cs
- SoapTypeAttribute.cs
- ProcessThreadCollection.cs
- MessageQueueKey.cs
- DataTableTypeConverter.cs
- BidOverLoads.cs
- EmptyCollection.cs
- TemplateControlParser.cs
- JapaneseLunisolarCalendar.cs
- GridSplitterAutomationPeer.cs
- CompilerCollection.cs
- SqlCommandBuilder.cs
- CryptoApi.cs
- ArrayElementGridEntry.cs
- ClientRuntimeConfig.cs
- Point3DCollectionConverter.cs
- IPGlobalProperties.cs
- Multiply.cs
- EnumValidator.cs
- DependencyObjectPropertyDescriptor.cs
- ObjectContextServiceProvider.cs
- ToolStripDropDownItem.cs
- _IPv6Address.cs
- WebPartManager.cs
- WindowsProgressbar.cs
- XmlHelper.cs
- TextRange.cs
- ColorTranslator.cs
- TextPenaltyModule.cs
- AsymmetricKeyExchangeDeformatter.cs
- SqlAggregateChecker.cs
- MethodBuilderInstantiation.cs
- StructuralObject.cs
- ProviderException.cs
- PathSegment.cs
- ComponentResourceManager.cs
- CannotUnloadAppDomainException.cs
- TrackingMemoryStreamFactory.cs
- IpcClientChannel.cs
- ToolStripSystemRenderer.cs
- InstanceBehavior.cs
- GlobalEventManager.cs
- DESCryptoServiceProvider.cs
- LinqMaximalSubtreeNominator.cs
- OleAutBinder.cs
- DynamicDataRouteHandler.cs
- Renderer.cs
- figurelengthconverter.cs
- _ListenerResponseStream.cs
- TraceSection.cs
- DataGridViewComboBoxEditingControl.cs
- ReadOnlyDictionary.cs
- XmlAnyAttributeAttribute.cs
- WebReferencesBuildProvider.cs
- DigitalSignatureProvider.cs
- Maps.cs
- FlowLayoutPanel.cs
- CodeVariableReferenceExpression.cs
- Object.cs
- OrderedDictionary.cs
- BaseValidator.cs
- HttpServerUtilityBase.cs
- TypeToStringValueConverter.cs
- CurrentTimeZone.cs
- OletxTransactionFormatter.cs
- PerformanceCounterPermission.cs
- IgnoreSection.cs
- PeerEndPoint.cs
- SubclassTypeValidatorAttribute.cs
- ListViewItem.cs
- ListControl.cs
- _Semaphore.cs
- SQLResource.cs
- WebEvents.cs
- Style.cs
- ColorAnimation.cs
- Completion.cs
- RuntimeTransactionHandle.cs
- DelimitedListTraceListener.cs
- UIPermission.cs
- ContainerVisual.cs
- TextBox.cs
- OledbConnectionStringbuilder.cs
- DataGridItem.cs
- PrintDialog.cs
- _NetRes.cs
- UriScheme.cs
- RetrieveVirtualItemEventArgs.cs