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
- ListViewInsertedEventArgs.cs
- SortDescription.cs
- WebPartTransformer.cs
- GroupDescription.cs
- ClientSponsor.cs
- WindowsAltTab.cs
- DataGridViewCheckBoxColumn.cs
- UnsafeNativeMethods.cs
- WindowsListViewItem.cs
- CatalogZoneBase.cs
- Graphics.cs
- TreeViewItemAutomationPeer.cs
- DataTableTypeConverter.cs
- Unit.cs
- Rect.cs
- Buffer.cs
- AuthenticationModuleElement.cs
- EditCommandColumn.cs
- EntityKey.cs
- MDIClient.cs
- PublisherMembershipCondition.cs
- CultureInfoConverter.cs
- ComAdminWrapper.cs
- PeerResolverMode.cs
- CultureInfoConverter.cs
- StringDictionaryEditor.cs
- UniqueConstraint.cs
- SetStateEventArgs.cs
- ImageCodecInfoPrivate.cs
- QueryCreatedEventArgs.cs
- CodeDirectoryCompiler.cs
- AppearanceEditorPart.cs
- SqlEnums.cs
- ForEachAction.cs
- SQLString.cs
- HashHelper.cs
- Sorting.cs
- ReflectPropertyDescriptor.cs
- SqlResolver.cs
- DispatchWrapper.cs
- StylusDownEventArgs.cs
- NTAccount.cs
- RawContentTypeMapper.cs
- TCEAdapterGenerator.cs
- XmlCharType.cs
- DataFormats.cs
- MediaCommands.cs
- DataGridItem.cs
- oledbmetadatacolumnnames.cs
- SafeEventLogWriteHandle.cs
- XmlPreloadedResolver.cs
- Trigger.cs
- SQLMembershipProvider.cs
- ChannelSinkStacks.cs
- WebHttpBinding.cs
- DesignerAttributeInfo.cs
- ColorConvertedBitmap.cs
- PrintPreviewControl.cs
- SecurityState.cs
- ClientApiGenerator.cs
- ListViewGroup.cs
- CollectionViewSource.cs
- MenuRendererStandards.cs
- UnionExpr.cs
- HttpChannelFactory.cs
- BitVector32.cs
- OracleDataReader.cs
- PrintPreviewDialog.cs
- SafeEventLogWriteHandle.cs
- ColumnWidthChangingEvent.cs
- SafeHandle.cs
- ModelChangedEventArgsImpl.cs
- ListItemCollection.cs
- TimeZone.cs
- CodeDirectiveCollection.cs
- RbTree.cs
- LineServices.cs
- Resources.Designer.cs
- NamedPipeAppDomainProtocolHandler.cs
- MeasureItemEvent.cs
- latinshape.cs
- TraceFilter.cs
- PlainXmlSerializer.cs
- Duration.cs
- InlineCollection.cs
- TextFormatterContext.cs
- SourceItem.cs
- _SecureChannel.cs
- QilList.cs
- Byte.cs
- DataSourceSelectArguments.cs
- LiteralTextContainerControlBuilder.cs
- RemoteWebConfigurationHost.cs
- SQLGuidStorage.cs
- EntryWrittenEventArgs.cs
- CodeDesigner.cs
- WhitespaceRuleReader.cs
- ControlBuilder.cs
- MenuItem.cs
- ToolBarButtonClickEvent.cs