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
- XamlInt32CollectionSerializer.cs
- CompiledQuery.cs
- ReadOnlyDataSourceView.cs
- __ComObject.cs
- UnmanagedHandle.cs
- StoreItemCollection.Loader.cs
- AQNBuilder.cs
- _ListenerAsyncResult.cs
- Internal.cs
- ArcSegment.cs
- GeneralTransformGroup.cs
- LayoutInformation.cs
- DesignerVerbToolStripMenuItem.cs
- AssemblyFilter.cs
- ISAPIApplicationHost.cs
- DescendantOverDescendantQuery.cs
- BufferModesCollection.cs
- Intellisense.cs
- ManualResetEventSlim.cs
- Int32.cs
- OleDbDataAdapter.cs
- List.cs
- SmtpFailedRecipientException.cs
- NodeInfo.cs
- TrackBar.cs
- _BaseOverlappedAsyncResult.cs
- MultiTrigger.cs
- ClientBuildManagerTypeDescriptionProviderBridge.cs
- ToolboxComponentsCreatingEventArgs.cs
- VectorCollectionValueSerializer.cs
- Axis.cs
- MessageFault.cs
- HttpProfileGroupBase.cs
- RegexMatch.cs
- Parameter.cs
- CultureMapper.cs
- WebPartExportVerb.cs
- TreeNode.cs
- Base64Encoding.cs
- AuthenticationSection.cs
- GeneralTransformGroup.cs
- ImageCodecInfoPrivate.cs
- DataObjectPastingEventArgs.cs
- VoiceObjectToken.cs
- QilName.cs
- SignatureHelper.cs
- CompilationRelaxations.cs
- AcceleratedTokenAuthenticator.cs
- SQLChars.cs
- Substitution.cs
- xmlglyphRunInfo.cs
- HttpListenerRequest.cs
- NetworkInformationPermission.cs
- RepeaterCommandEventArgs.cs
- RenderDataDrawingContext.cs
- TraceContext.cs
- StrokeNodeOperations2.cs
- SelectionProviderWrapper.cs
- IndexingContentUnit.cs
- SourceFileBuildProvider.cs
- PresentationUIStyleResources.cs
- CompilationLock.cs
- InternalRelationshipCollection.cs
- SystemException.cs
- ProgressBarAutomationPeer.cs
- ZipFileInfoCollection.cs
- CodeMemberEvent.cs
- TextBoxBase.cs
- DiffuseMaterial.cs
- XpsFilter.cs
- RequestContext.cs
- WebPartsPersonalizationAuthorization.cs
- X509AsymmetricSecurityKey.cs
- ScrollEvent.cs
- XmlComment.cs
- GenerateScriptTypeAttribute.cs
- ScriptReferenceEventArgs.cs
- _BasicClient.cs
- SerializeAbsoluteContext.cs
- TextTreeDeleteContentUndoUnit.cs
- GestureRecognizer.cs
- CursorInteropHelper.cs
- SubpageParagraph.cs
- ObjectAnimationUsingKeyFrames.cs
- ISessionStateStore.cs
- COMException.cs
- EventLogInternal.cs
- CalendarDay.cs
- CompiledWorkflowDefinitionContext.cs
- FilterQueryOptionExpression.cs
- TextTreeObjectNode.cs
- WinFormsSpinner.cs
- RuleInfoComparer.cs
- _TimerThread.cs
- SendKeys.cs
- BindValidationContext.cs
- MD5HashHelper.cs
- DesignerSerializerAttribute.cs
- DBCommand.cs
- ObjectDataSource.cs