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
- XmlSchemaComplexContentExtension.cs
- RTLAwareMessageBox.cs
- FixedDSBuilder.cs
- XPathNodeHelper.cs
- MarshalByRefObject.cs
- StrongNameUtility.cs
- ToolBarPanel.cs
- RootBrowserWindow.cs
- WarningException.cs
- PageThemeParser.cs
- XPathNodeHelper.cs
- ControlBuilderAttribute.cs
- HasCopySemanticsAttribute.cs
- MenuScrollingVisibilityConverter.cs
- SchemaImporterExtensionElement.cs
- SplashScreen.cs
- OleDbRowUpdatingEvent.cs
- UserPreferenceChangingEventArgs.cs
- ImageKeyConverter.cs
- AttributeCollection.cs
- BitSet.cs
- MatrixAnimationUsingKeyFrames.cs
- TextOutput.cs
- ReferenceSchema.cs
- CatalogUtil.cs
- BindingGroup.cs
- BitmapEffectGroup.cs
- DataBinding.cs
- MimeObjectFactory.cs
- DelayedRegex.cs
- XPathCompileException.cs
- XmlSubtreeReader.cs
- ListDataBindEventArgs.cs
- Timer.cs
- ListDictionary.cs
- PictureBox.cs
- DataObjectMethodAttribute.cs
- safemediahandle.cs
- GenericTransactionFlowAttribute.cs
- ToolboxCategoryItems.cs
- DeleteMemberBinder.cs
- DataSourceControlBuilder.cs
- WrapPanel.cs
- basecomparevalidator.cs
- UrlPath.cs
- BaseTemplateParser.cs
- ConnectionOrientedTransportManager.cs
- MexNamedPipeBindingElement.cs
- PathSegmentCollection.cs
- DoubleCollectionValueSerializer.cs
- PowerStatus.cs
- HttpWebRequestElement.cs
- PreviewPrintController.cs
- SqlTypesSchemaImporter.cs
- WindowsTokenRoleProvider.cs
- ConfigurationSectionGroup.cs
- HttpHandlerAction.cs
- ExceptionRoutedEventArgs.cs
- TdsParameterSetter.cs
- XXXOnTypeBuilderInstantiation.cs
- IChannel.cs
- URLString.cs
- UnhandledExceptionEventArgs.cs
- SubclassTypeValidatorAttribute.cs
- ValueTypeFixupInfo.cs
- InvalidDataException.cs
- AuthorizationSection.cs
- HtmlSelect.cs
- DateTimePickerDesigner.cs
- PlatformNotSupportedException.cs
- DisplayNameAttribute.cs
- UnsafeNativeMethods.cs
- TextProperties.cs
- OdbcConnectionFactory.cs
- XmlResolver.cs
- UIElement.cs
- SetStateEventArgs.cs
- COM2IPerPropertyBrowsingHandler.cs
- Function.cs
- XamlClipboardData.cs
- LinearGradientBrush.cs
- LoginView.cs
- TreeViewItem.cs
- RtfToXamlReader.cs
- IndependentAnimationStorage.cs
- RSAOAEPKeyExchangeFormatter.cs
- ThemeInfoAttribute.cs
- X509PeerCertificateElement.cs
- DrawingVisual.cs
- HtmlTableCellCollection.cs
- ClientBuildManager.cs
- basecomparevalidator.cs
- NumericPagerField.cs
- FontCacheLogic.cs
- Item.cs
- FileChangesMonitor.cs
- HostExecutionContextManager.cs
- DataFieldCollectionEditor.cs
- DesignerAttribute.cs
- SupportsEventValidationAttribute.cs