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
- Point.cs
- InstallerTypeAttribute.cs
- XmlTextReaderImpl.cs
- NavigationExpr.cs
- ParseNumbers.cs
- XmlCompatibilityReader.cs
- DbConnectionPool.cs
- WizardPanel.cs
- BitmapDownload.cs
- DataGridViewRow.cs
- CodeVariableDeclarationStatement.cs
- TransactionManager.cs
- CallbackException.cs
- DbConvert.cs
- ListItemParagraph.cs
- MatrixStack.cs
- TemplatedAdorner.cs
- CorrelationKeyCalculator.cs
- PriorityQueue.cs
- DbConnectionOptions.cs
- DispatcherOperation.cs
- InstalledFontCollection.cs
- ValueTable.cs
- RecommendedAsConfigurableAttribute.cs
- WebPartHelpVerb.cs
- UsernameTokenFactoryCredential.cs
- WebPartConnectionsConnectVerb.cs
- EventHandlersDesigner.cs
- Util.cs
- ClipboardProcessor.cs
- DataGridHeaderBorder.cs
- mediaeventshelper.cs
- StreamSecurityUpgradeInitiatorAsyncResult.cs
- StatusCommandUI.cs
- DocumentXPathNavigator.cs
- DataGridViewTextBoxCell.cs
- _NestedSingleAsyncResult.cs
- StrokeSerializer.cs
- DbgCompiler.cs
- SecureStringHasher.cs
- WebColorConverter.cs
- DataRowCollection.cs
- TemplateNameScope.cs
- MarginsConverter.cs
- IgnoreSectionHandler.cs
- TimeSpanParse.cs
- SHA256Managed.cs
- PageFunction.cs
- FixedSOMFixedBlock.cs
- RequestResizeEvent.cs
- ToolboxItemLoader.cs
- JournalEntry.cs
- WebPartEditorCancelVerb.cs
- HttpResponseInternalWrapper.cs
- InternalConfigEventArgs.cs
- WebHttpSecurityElement.cs
- SafeNativeMethods.cs
- IntSecurity.cs
- ToolTip.cs
- TogglePattern.cs
- FixedFindEngine.cs
- PathSegment.cs
- EncryptedPackage.cs
- TCPClient.cs
- ForEachDesigner.xaml.cs
- NativeBuffer.cs
- ClaimTypeElementCollection.cs
- __TransparentProxy.cs
- HTMLTagNameToTypeMapper.cs
- SafeRegistryHandle.cs
- ClientSponsor.cs
- ClientUrlResolverWrapper.cs
- ListViewSortEventArgs.cs
- ListBoxItemAutomationPeer.cs
- UnsafeNativeMethods.cs
- BindingBase.cs
- CollectionChangeEventArgs.cs
- CommonProperties.cs
- QilParameter.cs
- CodeNamespaceCollection.cs
- SymmetricKeyWrap.cs
- AmbientLight.cs
- BamlBinaryReader.cs
- ScrollViewer.cs
- UInt16Storage.cs
- UserControlCodeDomTreeGenerator.cs
- ContextMenuAutomationPeer.cs
- MD5.cs
- DBSqlParserColumn.cs
- BitStack.cs
- BaseInfoTable.cs
- DataGridViewColumnCollection.cs
- Command.cs
- StrongNameKeyPair.cs
- DataContext.cs
- PseudoWebRequest.cs
- Error.cs
- DbModificationCommandTree.cs
- DocumentSchemaValidator.cs
- DataStorage.cs