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
- ValidatingReaderNodeData.cs
- ButtonField.cs
- PrimitiveSchema.cs
- TextDecoration.cs
- MetadataProperty.cs
- BindingList.cs
- RoleBoolean.cs
- WSSecureConversationDec2005.cs
- ScrollBar.cs
- StyleCollection.cs
- Latin1Encoding.cs
- ResourceKey.cs
- WindowsSysHeader.cs
- DtrList.cs
- MetadataWorkspace.cs
- SqlUtils.cs
- DropShadowEffect.cs
- StatusBarPanelClickEvent.cs
- IntSecurity.cs
- DebugController.cs
- mediaeventshelper.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- Transaction.cs
- StaticExtension.cs
- ControlValuePropertyAttribute.cs
- GeometryConverter.cs
- EntityDataSourceReferenceGroup.cs
- UrlMapping.cs
- SimpleBitVector32.cs
- BaseParagraph.cs
- DeferredSelectedIndexReference.cs
- Emitter.cs
- DbgCompiler.cs
- MsmqOutputChannel.cs
- BaseCollection.cs
- RangeBaseAutomationPeer.cs
- ipaddressinformationcollection.cs
- OutputBuffer.cs
- GenericXmlSecurityToken.cs
- SplitterEvent.cs
- TrustSection.cs
- DataColumnMappingCollection.cs
- EntityTypeEmitter.cs
- Calendar.cs
- SHA256.cs
- WebEventTraceProvider.cs
- FrameDimension.cs
- Point3DCollectionConverter.cs
- StringDictionaryCodeDomSerializer.cs
- ContextQuery.cs
- Brush.cs
- ProxyHwnd.cs
- Thumb.cs
- LinqToSqlWrapper.cs
- ClientConvert.cs
- Group.cs
- WebPartManager.cs
- ConfigXmlComment.cs
- FormatterServices.cs
- UriWriter.cs
- SqlBinder.cs
- StrongName.cs
- DesignerOptionService.cs
- ItemsPresenter.cs
- ConfigurationProperty.cs
- UriExt.cs
- RenderData.cs
- DataGridLength.cs
- ExpandableObjectConverter.cs
- mediaeventargs.cs
- QueryAccessibilityHelpEvent.cs
- WebPartTracker.cs
- SqlInternalConnection.cs
- DataSourceControl.cs
- IListConverters.cs
- ConfigDefinitionUpdates.cs
- FtpRequestCacheValidator.cs
- commandenforcer.cs
- SafeNativeMethodsCLR.cs
- Stroke.cs
- FilteredDataSetHelper.cs
- SmiRecordBuffer.cs
- Brush.cs
- DataSourceControl.cs
- LocalizableAttribute.cs
- _TLSstream.cs
- RegexRunnerFactory.cs
- PriorityBinding.cs
- TextTreeUndoUnit.cs
- ProcessHostMapPath.cs
- pingexception.cs
- PerformanceCountersElement.cs
- FontUnitConverter.cs
- HMACSHA256.cs
- GridSplitter.cs
- BufferBuilder.cs
- TargetPerspective.cs
- MemberRestriction.cs
- ParameterCollection.cs
- HtmlInputImage.cs