Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Data / System / Data / ProviderBase / WrappedIUnknown.cs / 1305376 / WrappedIUnknown.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.ProviderBase {
using System;
using System.Data.Common;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Threading;
// We wrap the interface as a native IUnknown IntPtr so that every
// thread that creates a connection will fake the correct context when
// in transactions, otherwise everything is marshalled. We do this
// for two reasons: first for the connection pooler, this is a significant
// performance gain, second for the OLE DB provider, it doesn't marshal.
internal class WrappedIUnknown : SafeHandle {
internal WrappedIUnknown() : base(IntPtr.Zero, true) {
}
internal WrappedIUnknown(object unknown) : this() {
if (null != unknown) {
RuntimeHelpers.PrepareConstrainedRegions();
try {} finally {
base.handle = Marshal.GetIUnknownForObject(unknown); //
}
}
}
public override bool IsInvalid {
get {
return (IntPtr.Zero == base.handle);
}
}
internal object ComWrapper() {
// NOTE: Method, instead of property, to avoid being evaluated at
// runtime in the debugger.
object value = null;
bool mustRelease = false;
RuntimeHelpers.PrepareConstrainedRegions();
try {
DangerousAddRef(ref mustRelease);
IntPtr handle = DangerousGetHandle();
value = System.Runtime.Remoting.Services.EnterpriseServicesHelper.WrapIUnknownWithComObject(handle);
}
finally {
if (mustRelease) {
DangerousRelease();
}
}
return value;
}
override protected bool ReleaseHandle() {
// NOTE: The SafeHandle class guarantees this will be called exactly once.
IntPtr ptr = base.handle;
base.handle = IntPtr.Zero;
if (IntPtr.Zero != ptr) {
Marshal.Release(ptr);
}
return true;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
// [....]
//-----------------------------------------------------------------------------
namespace System.Data.ProviderBase {
using System;
using System.Data.Common;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Threading;
// We wrap the interface as a native IUnknown IntPtr so that every
// thread that creates a connection will fake the correct context when
// in transactions, otherwise everything is marshalled. We do this
// for two reasons: first for the connection pooler, this is a significant
// performance gain, second for the OLE DB provider, it doesn't marshal.
internal class WrappedIUnknown : SafeHandle {
internal WrappedIUnknown() : base(IntPtr.Zero, true) {
}
internal WrappedIUnknown(object unknown) : this() {
if (null != unknown) {
RuntimeHelpers.PrepareConstrainedRegions();
try {} finally {
base.handle = Marshal.GetIUnknownForObject(unknown); //
}
}
}
public override bool IsInvalid {
get {
return (IntPtr.Zero == base.handle);
}
}
internal object ComWrapper() {
// NOTE: Method, instead of property, to avoid being evaluated at
// runtime in the debugger.
object value = null;
bool mustRelease = false;
RuntimeHelpers.PrepareConstrainedRegions();
try {
DangerousAddRef(ref mustRelease);
IntPtr handle = DangerousGetHandle();
value = System.Runtime.Remoting.Services.EnterpriseServicesHelper.WrapIUnknownWithComObject(handle);
}
finally {
if (mustRelease) {
DangerousRelease();
}
}
return value;
}
override protected bool ReleaseHandle() {
// NOTE: The SafeHandle class guarantees this will be called exactly once.
IntPtr ptr = base.handle;
base.handle = IntPtr.Zero;
if (IntPtr.Zero != ptr) {
Marshal.Release(ptr);
}
return true;
}
}
}
// 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
- LinkUtilities.cs
- ArrayEditor.cs
- FormViewAutoFormat.cs
- OutOfMemoryException.cs
- XmlTextReader.cs
- ConcurrencyBehavior.cs
- RegexBoyerMoore.cs
- AttachmentCollection.cs
- CompositionAdorner.cs
- PipelineModuleStepContainer.cs
- Int32CollectionConverter.cs
- ContractType.cs
- _CookieModule.cs
- SoapSchemaExporter.cs
- MasterPageBuildProvider.cs
- HttpHandlersSection.cs
- Viewport2DVisual3D.cs
- MenuItemAutomationPeer.cs
- CompiledIdentityConstraint.cs
- NotFiniteNumberException.cs
- IDQuery.cs
- DataGridAutomationPeer.cs
- UIElementParagraph.cs
- MenuCommandsChangedEventArgs.cs
- MatrixAnimationUsingKeyFrames.cs
- StoreUtilities.cs
- Point3DAnimationBase.cs
- PathFigure.cs
- ConnectionOrientedTransportChannelListener.cs
- Button.cs
- MemberRelationshipService.cs
- GlyphCache.cs
- PrintPreviewGraphics.cs
- ColorMap.cs
- JobPageOrder.cs
- ColorTranslator.cs
- HttpHandlerActionCollection.cs
- CodeAttributeDeclaration.cs
- AbstractSvcMapFileLoader.cs
- ViewStateModeByIdAttribute.cs
- TypeResolver.cs
- XPathArrayIterator.cs
- XmlIncludeAttribute.cs
- RetriableClipboard.cs
- LoginNameDesigner.cs
- DataGrid.cs
- RefExpr.cs
- ChangeBlockUndoRecord.cs
- ipaddressinformationcollection.cs
- CompareValidator.cs
- Rule.cs
- WorkflowInlining.cs
- ComNativeDescriptor.cs
- VirtualDirectoryMapping.cs
- ScriptControl.cs
- Point3DConverter.cs
- DataComponentMethodGenerator.cs
- SymmetricCryptoHandle.cs
- XPathAncestorQuery.cs
- EpmContentSerializerBase.cs
- ConfigXmlCDataSection.cs
- AddInAttribute.cs
- DesignerDataTable.cs
- TableRowCollection.cs
- SafeEventLogWriteHandle.cs
- EtwTrace.cs
- Base64Decoder.cs
- WorkerRequest.cs
- FileReader.cs
- HideDisabledControlAdapter.cs
- ConfigurationCollectionAttribute.cs
- DeadCharTextComposition.cs
- DomainUpDown.cs
- ChangeConflicts.cs
- EastAsianLunisolarCalendar.cs
- DataGridColumnsPage.cs
- ArrayItemValue.cs
- MailWebEventProvider.cs
- HiddenField.cs
- TaiwanCalendar.cs
- SqlRecordBuffer.cs
- BasicBrowserDialog.designer.cs
- TextInfo.cs
- HtmlElementCollection.cs
- FileChangeNotifier.cs
- ExponentialEase.cs
- TypeAccessException.cs
- Update.cs
- SoapElementAttribute.cs
- SqlBulkCopyColumnMapping.cs
- WizardForm.cs
- SoapAttributes.cs
- Literal.cs
- DesignBindingValueUIHandler.cs
- State.cs
- SchemaObjectWriter.cs
- PlainXmlWriter.cs
- SiteMapDataSourceView.cs
- LinearQuaternionKeyFrame.cs
- BufferBuilder.cs