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
- StickyNoteAnnotations.cs
- SaveRecipientRequest.cs
- ReadOnlyMetadataCollection.cs
- EventsTab.cs
- Light.cs
- KeyboardEventArgs.cs
- XmlSequenceWriter.cs
- ObjectDataSourceSelectingEventArgs.cs
- DocumentViewerBase.cs
- StringSorter.cs
- ReadOnlyPropertyMetadata.cs
- ValidatorUtils.cs
- PixelFormat.cs
- GeometryConverter.cs
- securitycriticaldata.cs
- IntSecurity.cs
- RegexReplacement.cs
- CompositeFontParser.cs
- Visitor.cs
- Deflater.cs
- HttpListenerContext.cs
- DBSqlParserTableCollection.cs
- SettingsProperty.cs
- CuspData.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- CreateUserWizardAutoFormat.cs
- querybuilder.cs
- SafeArrayRankMismatchException.cs
- CommandID.cs
- ContentPresenter.cs
- RequestCachePolicy.cs
- EdmToObjectNamespaceMap.cs
- ProfilePropertyMetadata.cs
- XmlSchemaDocumentation.cs
- ImageMapEventArgs.cs
- OneWayBindingElementImporter.cs
- DataGridGeneralPage.cs
- GridViewUpdatedEventArgs.cs
- XPathAncestorQuery.cs
- ParameterElementCollection.cs
- PromptBuilder.cs
- PersonalizationProvider.cs
- SecondaryViewProvider.cs
- EtwTrace.cs
- MasterPageParser.cs
- FilteredSchemaElementLookUpTable.cs
- ReachPageContentCollectionSerializerAsync.cs
- HtmlInputHidden.cs
- Environment.cs
- ErrorReporting.cs
- NoneExcludedImageIndexConverter.cs
- UIElementIsland.cs
- InputLanguageSource.cs
- OracleBinary.cs
- BaseUriHelper.cs
- DataGridTablesFactory.cs
- HtmlPanelAdapter.cs
- WebPartTransformerAttribute.cs
- PriorityItem.cs
- MultiPropertyDescriptorGridEntry.cs
- GeneralTransformGroup.cs
- Choices.cs
- MultipartContentParser.cs
- WebMethodAttribute.cs
- CookieProtection.cs
- ExeContext.cs
- Monitor.cs
- OleDbInfoMessageEvent.cs
- ExpressionNormalizer.cs
- FlowDocumentView.cs
- UnsafeNetInfoNativeMethods.cs
- SqlParameter.cs
- TableParaClient.cs
- StateInitialization.cs
- BulletDecorator.cs
- TextTreeExtractElementUndoUnit.cs
- DashStyle.cs
- ILGenerator.cs
- Block.cs
- WinEventWrap.cs
- SqlOuterApplyReducer.cs
- RecipientInfo.cs
- DateTimeParse.cs
- DesignTimeXamlWriter.cs
- Logging.cs
- DocobjHost.cs
- RecognizedAudio.cs
- SmtpClient.cs
- ConfigurationManager.cs
- RedirectionProxy.cs
- TableLayoutCellPaintEventArgs.cs
- CoordinationService.cs
- ResourcesBuildProvider.cs
- XmlTextReaderImplHelpers.cs
- TargetException.cs
- WebHttpBindingCollectionElement.cs
- ImageIndexConverter.cs
- SafeCoTaskMem.cs
- InteropAutomationProvider.cs
- elementinformation.cs