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
- RNGCryptoServiceProvider.cs
- PathTooLongException.cs
- DBParameter.cs
- SamlAuthorizationDecisionClaimResource.cs
- DataServiceProviderMethods.cs
- ObjectStateFormatter.cs
- RefreshEventArgs.cs
- Simplifier.cs
- ReadOnlyCollectionBase.cs
- VariableExpressionConverter.cs
- MarkerProperties.cs
- Menu.cs
- OAVariantLib.cs
- DrawListViewColumnHeaderEventArgs.cs
- Grant.cs
- HostedElements.cs
- Tablet.cs
- TiffBitmapDecoder.cs
- unsafenativemethodstextservices.cs
- Message.cs
- FastPropertyAccessor.cs
- EditingMode.cs
- InstanceDataCollection.cs
- OrderPreservingPipeliningSpoolingTask.cs
- SecurityUtils.cs
- ThreadAbortException.cs
- SingleBodyParameterMessageFormatter.cs
- SafeSystemMetrics.cs
- AuthorizationPolicyTypeElementCollection.cs
- PublisherIdentityPermission.cs
- _SSPISessionCache.cs
- VariableBinder.cs
- DataControlFieldHeaderCell.cs
- QilSortKey.cs
- GridPattern.cs
- Perspective.cs
- XmlAggregates.cs
- SmtpMail.cs
- SqlLiftWhereClauses.cs
- Label.cs
- Literal.cs
- InputBinder.cs
- ScriptManagerProxy.cs
- HttpWriter.cs
- Panel.cs
- ToolStripContainer.cs
- CodeTypeReferenceExpression.cs
- HandlerFactoryWrapper.cs
- AuthenticateEventArgs.cs
- CallbackValidator.cs
- BaseEntityWrapper.cs
- Byte.cs
- FieldAccessException.cs
- DoubleLinkList.cs
- RowParagraph.cs
- BookmarkNameHelper.cs
- WindowsTab.cs
- CmsInterop.cs
- PartialClassGenerationTaskInternal.cs
- LinearQuaternionKeyFrame.cs
- DataSourceCache.cs
- GeneralTransformGroup.cs
- DataTemplateSelector.cs
- BaseDataList.cs
- HttpCacheParams.cs
- _FtpControlStream.cs
- DetailsViewInsertedEventArgs.cs
- RecommendedAsConfigurableAttribute.cs
- DEREncoding.cs
- dataprotectionpermission.cs
- TranslateTransform3D.cs
- DeferrableContentConverter.cs
- XmlDictionaryReaderQuotasElement.cs
- FilteredAttributeCollection.cs
- DataGridrowEditEndingEventArgs.cs
- HwndTarget.cs
- Proxy.cs
- PartialArray.cs
- VectorValueSerializer.cs
- RIPEMD160.cs
- WeakReferenceEnumerator.cs
- NullableFloatAverageAggregationOperator.cs
- RequestCacheManager.cs
- SID.cs
- Int32AnimationUsingKeyFrames.cs
- Compiler.cs
- SuppressMergeCheckAttribute.cs
- ToolboxBitmapAttribute.cs
- MetroSerializationManager.cs
- StringKeyFrameCollection.cs
- CollectionBuilder.cs
- ItemPager.cs
- Int32CAMarshaler.cs
- BrushConverter.cs
- SizeF.cs
- SrgsRuleRef.cs
- _NTAuthentication.cs
- SafeEventHandle.cs
- SemanticAnalyzer.cs
- DictionaryBase.cs