Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Core / CSharp / System / Windows / Media / SafeMILHandle.cs / 2 / SafeMILHandle.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: // A safe way to deal with unmanaged MIL interface pointers. //--------------------------------------------------------------------------- using System; using System.IO; using System.Security; using System.Security.Permissions; using System.Collections; using System.Reflection; using MS.Internal; using MS.Win32; using System.Diagnostics; using System.Windows.Media; using System.Runtime; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using Microsoft.Win32.SafeHandles; using Microsoft.Internal; using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods; namespace System.Windows.Media { internal class SafeMILHandle : SafeHandleZeroOrMinusOneIsInvalid { ////// Use this constructor if the handle isn't ready yet and later /// set the handle with SetHandle. SafeMILHandle owns the release /// of the handle. /// ////// Critical: This derives from a class that has a link demand and inheritance demand /// TreatAsSafe: Ok to call constructor /// [SecurityCritical,SecurityTreatAsSafe] internal SafeMILHandle() : base(true) { } ////// Use this constructor if the handle exists at construction time. /// SafeMILHandle owns the release of the parameter. /// ////// Critical: This code calls UpdateEstimatedSize. /// It is used to keep memory around /// [SecurityCritical] internal SafeMILHandle(IntPtr handle, long estimatedSize) : base(true) { SetHandle(handle); // // Hint the GC at the size of the unmanaged memory associated with // this object. We release pressure in the finalizer. // UpdateEstimatedSize(estimatedSize); } ////// Change our size to the new size specified /// ////// Critical: This code calls into AddMemoryPressure and RemoveMemoryPressure /// both of which have link demands. It is used to keep memory around /// [SecurityCritical] internal void UpdateEstimatedSize(long estimatedSize) { if (_gcPressure > 0) { MemoryPressure.Remove(_gcPressure); } _gcPressure = estimatedSize; if (_gcPressure > 0) { MemoryPressure.Add(_gcPressure); } } ////// Critical - calls unmanaged code, not treat as safe because you must /// validate that handle is a valid COM object. /// [SecurityCritical] protected override bool ReleaseHandle() { UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref handle); // // We've released the unmangaed memory, so remove associated // GC pressure. // UpdateEstimatedSize(0); return true; } // // Estimated size in bytes of the unmanaged memory we are holding onto // private long _gcPressure; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // // Description: // A safe way to deal with unmanaged MIL interface pointers. //--------------------------------------------------------------------------- using System; using System.IO; using System.Security; using System.Security.Permissions; using System.Collections; using System.Reflection; using MS.Internal; using MS.Win32; using System.Diagnostics; using System.Windows.Media; using System.Runtime; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using Microsoft.Win32.SafeHandles; using Microsoft.Internal; using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods; namespace System.Windows.Media { internal class SafeMILHandle : SafeHandleZeroOrMinusOneIsInvalid { ////// Use this constructor if the handle isn't ready yet and later /// set the handle with SetHandle. SafeMILHandle owns the release /// of the handle. /// ////// Critical: This derives from a class that has a link demand and inheritance demand /// TreatAsSafe: Ok to call constructor /// [SecurityCritical,SecurityTreatAsSafe] internal SafeMILHandle() : base(true) { } ////// Use this constructor if the handle exists at construction time. /// SafeMILHandle owns the release of the parameter. /// ////// Critical: This code calls UpdateEstimatedSize. /// It is used to keep memory around /// [SecurityCritical] internal SafeMILHandle(IntPtr handle, long estimatedSize) : base(true) { SetHandle(handle); // // Hint the GC at the size of the unmanaged memory associated with // this object. We release pressure in the finalizer. // UpdateEstimatedSize(estimatedSize); } ////// Change our size to the new size specified /// ////// Critical: This code calls into AddMemoryPressure and RemoveMemoryPressure /// both of which have link demands. It is used to keep memory around /// [SecurityCritical] internal void UpdateEstimatedSize(long estimatedSize) { if (_gcPressure > 0) { MemoryPressure.Remove(_gcPressure); } _gcPressure = estimatedSize; if (_gcPressure > 0) { MemoryPressure.Add(_gcPressure); } } ////// Critical - calls unmanaged code, not treat as safe because you must /// validate that handle is a valid COM object. /// [SecurityCritical] protected override bool ReleaseHandle() { UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref handle); // // We've released the unmangaed memory, so remove associated // GC pressure. // UpdateEstimatedSize(0); return true; } // // Estimated size in bytes of the unmanaged memory we are holding onto // private long _gcPressure; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SoapSchemaMember.cs
- ChannelServices.cs
- PtsPage.cs
- XmlToDatasetMap.cs
- EastAsianLunisolarCalendar.cs
- OracleString.cs
- XmlTextReaderImpl.cs
- DataChangedEventManager.cs
- ContentWrapperAttribute.cs
- mediaeventshelper.cs
- CodeCatchClause.cs
- ConvertEvent.cs
- MiniLockedBorderGlyph.cs
- TrackingMemoryStreamFactory.cs
- SqlMethods.cs
- SQLString.cs
- TextTrailingWordEllipsis.cs
- AuthorizationRuleCollection.cs
- BookmarkTable.cs
- AvTrace.cs
- GridViewPageEventArgs.cs
- CultureNotFoundException.cs
- ExpressionVisitor.cs
- SizeValueSerializer.cs
- XPathDocument.cs
- GestureRecognizer.cs
- InvalidOleVariantTypeException.cs
- OdbcCommandBuilder.cs
- XmlWrappingWriter.cs
- PropertyGridCommands.cs
- SecurityUtils.cs
- CheckBoxAutomationPeer.cs
- PKCS1MaskGenerationMethod.cs
- Preprocessor.cs
- SqlNodeAnnotations.cs
- ManipulationDevice.cs
- XPathArrayIterator.cs
- Classification.cs
- ContextProperty.cs
- DifferencingCollection.cs
- TableCellCollection.cs
- Int32CAMarshaler.cs
- ObjectNavigationPropertyMapping.cs
- Rijndael.cs
- KeyTime.cs
- MimeXmlImporter.cs
- Avt.cs
- ChameleonKey.cs
- ShutDownListener.cs
- Convert.cs
- TextEffect.cs
- filewebresponse.cs
- DetailsView.cs
- Substitution.cs
- fixedPageContentExtractor.cs
- SwitchCase.cs
- HelpProvider.cs
- UniqueCodeIdentifierScope.cs
- ProgressBar.cs
- ParameterReplacerVisitor.cs
- InputBindingCollection.cs
- FamilyMap.cs
- IdentityHolder.cs
- ReadOnlyDictionary.cs
- EdmSchemaAttribute.cs
- ExpressionServices.cs
- TablePattern.cs
- InputScopeNameConverter.cs
- TransformConverter.cs
- VisualTarget.cs
- TextRangeSerialization.cs
- OdbcStatementHandle.cs
- NavigationPropertyEmitter.cs
- Int16.cs
- ComponentCodeDomSerializer.cs
- RowToParametersTransformer.cs
- UIElementCollection.cs
- UnderstoodHeaders.cs
- StoreAnnotationsMap.cs
- IdleTimeoutMonitor.cs
- ItemsControlAutomationPeer.cs
- SharedPersonalizationStateInfo.cs
- TableLayoutStyleCollection.cs
- PositiveTimeSpanValidatorAttribute.cs
- DispatcherSynchronizationContext.cs
- XmlSchemaGroup.cs
- HighContrastHelper.cs
- Line.cs
- DictionaryItemsCollection.cs
- RefreshInfo.cs
- PageContent.cs
- sqlinternaltransaction.cs
- ContentValidator.cs
- GeometryModel3D.cs
- OleDbMetaDataFactory.cs
- BinaryMethodMessage.cs
- FileDialogPermission.cs
- CodeSubDirectory.cs
- ReverseInheritProperty.cs
- UrlAuthFailedErrorFormatter.cs