Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Core / CSharp / System / Windows / Media / SafeMILHandle.cs / 1 / 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
- LocationReferenceEnvironment.cs
- XmlSchemaElement.cs
- UntypedNullExpression.cs
- StringBuilder.cs
- LongTypeConverter.cs
- SerialStream.cs
- EntityTypeBase.cs
- NamedPermissionSet.cs
- DataTableClearEvent.cs
- DetailsViewUpdateEventArgs.cs
- DocumentSequenceHighlightLayer.cs
- WorkflowViewService.cs
- SplitContainer.cs
- ObjectCacheHost.cs
- GACIdentityPermission.cs
- Size.cs
- NavigationEventArgs.cs
- Config.cs
- UnsafeNativeMethods.cs
- PropertyTabAttribute.cs
- TableTextElementCollectionInternal.cs
- ContextMenuStrip.cs
- StateItem.cs
- OracleConnectionFactory.cs
- FontEmbeddingManager.cs
- MemberRelationshipService.cs
- ServicesUtilities.cs
- XappLauncher.cs
- RuntimeHelpers.cs
- SvcMapFileSerializer.cs
- XmlMtomReader.cs
- DispatcherProcessingDisabled.cs
- SelectedCellsChangedEventArgs.cs
- ClientFactory.cs
- ThreadAbortException.cs
- DataStreams.cs
- DynamicDataExtensions.cs
- TransformerConfigurationWizardBase.cs
- RoutingExtensionElement.cs
- WCFModelStrings.Designer.cs
- TypeLoadException.cs
- EntityDataSourceColumn.cs
- NullToBooleanConverter.cs
- DbConnectionPoolIdentity.cs
- BevelBitmapEffect.cs
- NonVisualControlAttribute.cs
- dataprotectionpermission.cs
- HttpRequest.cs
- Decimal.cs
- ReflectionPermission.cs
- HttpResponseInternalWrapper.cs
- ParameterCollection.cs
- WindowsToolbar.cs
- base64Transforms.cs
- baseaxisquery.cs
- ImageAutomationPeer.cs
- ColumnCollection.cs
- Pts.cs
- ResolveMatches11.cs
- RegistrationServices.cs
- ConfigurationValidatorBase.cs
- SharedPerformanceCounter.cs
- lengthconverter.cs
- ProxyGenerationError.cs
- CmsInterop.cs
- Parallel.cs
- DateTimeConstantAttribute.cs
- ScriptResourceInfo.cs
- TypedOperationInfo.cs
- GroupItemAutomationPeer.cs
- AssemblyBuilder.cs
- ImageSourceConverter.cs
- TreeView.cs
- ClonableStack.cs
- ServiceBusyException.cs
- RepeatEnumerable.cs
- QueryCacheEntry.cs
- TagMapCollection.cs
- ReadOnlyCollection.cs
- Camera.cs
- DisplayToken.cs
- PropertyConverter.cs
- EventSetter.cs
- HostedController.cs
- WorkItem.cs
- JoinQueryOperator.cs
- AttachmentCollection.cs
- SettingsPropertyNotFoundException.cs
- SqlDataRecord.cs
- HashCodeCombiner.cs
- TrustLevel.cs
- ProvidePropertyAttribute.cs
- PathFigure.cs
- RelationshipType.cs
- UmAlQuraCalendar.cs
- TypeReference.cs
- TextBoxRenderer.cs
- MULTI_QI.cs
- ChangesetResponse.cs
- InternalControlCollection.cs