Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / 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);
}
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- RegistrationServices.cs
- ScrollEventArgs.cs
- ExtensionQuery.cs
- FontFamilyValueSerializer.cs
- Tile.cs
- FileClassifier.cs
- LookupBindingPropertiesAttribute.cs
- DefaultValueTypeConverter.cs
- ResponseStream.cs
- TraceListener.cs
- XmlAttributeOverrides.cs
- RsaSecurityTokenParameters.cs
- Literal.cs
- RegisteredScript.cs
- SystemIcmpV4Statistics.cs
- PeerPresenceInfo.cs
- Attributes.cs
- ActivityBuilderHelper.cs
- SqlDataSourceConnectionPanel.cs
- SvcFileManager.cs
- SafePEFileHandle.cs
- Constraint.cs
- BindValidator.cs
- Errors.cs
- AxisAngleRotation3D.cs
- DataBoundLiteralControl.cs
- CloseCollectionAsyncResult.cs
- XMLSyntaxException.cs
- QueryStringHandler.cs
- OdbcParameter.cs
- Graph.cs
- WpfGeneratedKnownProperties.cs
- Site.cs
- EventBuilder.cs
- Screen.cs
- SqlCommandSet.cs
- SystemUdpStatistics.cs
- TreeViewHitTestInfo.cs
- DbModificationClause.cs
- TextParagraphProperties.cs
- ConfigurationStrings.cs
- UnsafeNativeMethodsCLR.cs
- _LazyAsyncResult.cs
- Material.cs
- OptionUsage.cs
- ToolStripMenuItem.cs
- KernelTypeValidation.cs
- TPLETWProvider.cs
- ContainerCodeDomSerializer.cs
- RtType.cs
- Stream.cs
- ObjectViewFactory.cs
- ActiveXMessageFormatter.cs
- HttpWebResponse.cs
- DbMetaDataCollectionNames.cs
- GridPatternIdentifiers.cs
- TypeBuilderInstantiation.cs
- OracleColumn.cs
- SendMailErrorEventArgs.cs
- ThumbAutomationPeer.cs
- PropertyGeneratedEventArgs.cs
- FixedTextBuilder.cs
- PageSetupDialog.cs
- HasCopySemanticsAttribute.cs
- Tokenizer.cs
- Int64.cs
- datacache.cs
- CellPartitioner.cs
- GatewayIPAddressInformationCollection.cs
- RightsManagementResourceHelper.cs
- ObjectNotFoundException.cs
- _DomainName.cs
- SystemUdpStatistics.cs
- Number.cs
- TextRangeEditTables.cs
- CompoundFileStreamReference.cs
- EmptyControlCollection.cs
- LayoutTableCell.cs
- SiteMapSection.cs
- BamlResourceContent.cs
- BooleanSwitch.cs
- CodeArgumentReferenceExpression.cs
- Int64AnimationUsingKeyFrames.cs
- ShaderRenderModeValidation.cs
- SafeFileHandle.cs
- MsmqProcessProtocolHandler.cs
- PipeStream.cs
- ConditionValidator.cs
- _WebProxyDataBuilder.cs
- ClientSettingsStore.cs
- UnSafeCharBuffer.cs
- ProviderMetadata.cs
- SoapAttributes.cs
- ReaderWriterLockSlim.cs
- InkCanvasInnerCanvas.cs
- TextBoxView.cs
- ComponentEvent.cs
- IssuedTokenClientCredential.cs
- IPHostEntry.cs
- CellTreeNode.cs