Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CopyOnWriteList.cs
- ObjectListSelectEventArgs.cs
- PropertyCollection.cs
- ToolStripPanel.cs
- NonSerializedAttribute.cs
- FaultImportOptions.cs
- QilExpression.cs
- TreeViewItem.cs
- ScalarOps.cs
- XmlIgnoreAttribute.cs
- WorkflowRuntimeEndpoint.cs
- Panel.cs
- DataExpression.cs
- FrameworkContentElement.cs
- DataBoundControlAdapter.cs
- Thickness.cs
- TemplateLookupAction.cs
- LicenseContext.cs
- X509SecurityTokenProvider.cs
- SqlSupersetValidator.cs
- PersonalizableAttribute.cs
- CommandManager.cs
- FindCompletedEventArgs.cs
- XamlTreeBuilder.cs
- CacheSection.cs
- TdsEnums.cs
- SeparatorAutomationPeer.cs
- Viewport3DVisual.cs
- XmlStringTable.cs
- ExtensionsSection.cs
- smtpconnection.cs
- WebHostUnsafeNativeMethods.cs
- IResourceProvider.cs
- UriSection.cs
- RuntimeDelegateArgument.cs
- WorkflowMarkupSerializationProvider.cs
- StylusPointDescription.cs
- PerformanceCounterCategory.cs
- XmlSchemaComplexContent.cs
- UserNamePasswordValidator.cs
- SoapIgnoreAttribute.cs
- Encoding.cs
- WorkflowStateRollbackService.cs
- PhysicalFontFamily.cs
- StoryFragments.cs
- EditingScopeUndoUnit.cs
- CodeTypeDeclaration.cs
- MenuAdapter.cs
- WebSysDisplayNameAttribute.cs
- Point.cs
- DBConnectionString.cs
- RemoveStoryboard.cs
- LinkButton.cs
- TransactionsSectionGroup.cs
- DynamicILGenerator.cs
- ServiceXNameTypeConverter.cs
- DispatcherOperation.cs
- ParameterCollection.cs
- CaseStatementProjectedSlot.cs
- IndexOutOfRangeException.cs
- WmlFormAdapter.cs
- NumberFormatter.cs
- LineMetrics.cs
- PageAsyncTask.cs
- altserialization.cs
- PointAnimationClockResource.cs
- SizeFConverter.cs
- SByte.cs
- UDPClient.cs
- RegistryPermission.cs
- MsmqPoisonMessageException.cs
- ISAPIRuntime.cs
- keycontainerpermission.cs
- AttachedAnnotationChangedEventArgs.cs
- EpmTargetTree.cs
- CompileLiteralTextParser.cs
- AppDomainUnloadedException.cs
- OrderedDictionaryStateHelper.cs
- PathData.cs
- HttpListenerElement.cs
- WCFBuildProvider.cs
- ActivitySurrogateSelector.cs
- Trigger.cs
- IsolatedStorageSecurityState.cs
- IRCollection.cs
- StdValidatorsAndConverters.cs
- SQLChars.cs
- TablePattern.cs
- VisualBrush.cs
- ReadOnlyHierarchicalDataSourceView.cs
- GridViewRowEventArgs.cs
- PerfService.cs
- PriorityItem.cs
- TextTreeDeleteContentUndoUnit.cs
- KeyValuePairs.cs
- FontStyles.cs
- RefType.cs
- SessionIDManager.cs
- UpdateCommand.cs
- BamlLocalizerErrorNotifyEventArgs.cs