Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Data / System / Data / ProviderBase / WrappedIUnknown.cs / 1 / 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
- XmlSchemaChoice.cs
- FilterQuery.cs
- TextEditorCharacters.cs
- Stopwatch.cs
- TdsRecordBufferSetter.cs
- StringArrayConverter.cs
- ReferencedCollectionType.cs
- Suspend.cs
- Point4DValueSerializer.cs
- SqlBulkCopyColumnMapping.cs
- TagMapCollection.cs
- DataGridrowEditEndingEventArgs.cs
- Substitution.cs
- SQLChars.cs
- DataStreamFromComStream.cs
- MultitargetUtil.cs
- TextPointerBase.cs
- CqlErrorHelper.cs
- EntityDataSourceContextCreatingEventArgs.cs
- TypeLoadException.cs
- IsolatedStorageSecurityState.cs
- CodeCatchClause.cs
- SimpleHandlerBuildProvider.cs
- Config.cs
- StringFreezingAttribute.cs
- MetadataException.cs
- FieldBuilder.cs
- ValueHandle.cs
- TextRangeEditLists.cs
- DefaultBinder.cs
- HyperLinkStyle.cs
- DataSet.cs
- XmlDocumentType.cs
- panel.cs
- UriParserTemplates.cs
- DataSourceBooleanViewSchemaConverter.cs
- __Filters.cs
- ArglessEventHandlerProxy.cs
- BreakRecordTable.cs
- TextShapeableCharacters.cs
- OdbcUtils.cs
- GlobalId.cs
- OdbcReferenceCollection.cs
- TabControlCancelEvent.cs
- CharAnimationBase.cs
- control.ime.cs
- HostSecurityManager.cs
- WindowsUserNameCachingSecurityTokenAuthenticator.cs
- SocketPermission.cs
- WebRequestModuleElement.cs
- TypefaceMetricsCache.cs
- LinqDataSourceDeleteEventArgs.cs
- basemetadatamappingvisitor.cs
- EntityCommandExecutionException.cs
- RegistryDataKey.cs
- CachedPathData.cs
- PageRouteHandler.cs
- TypeConverterHelper.cs
- SurrogateEncoder.cs
- ConfigXmlAttribute.cs
- pingexception.cs
- StorageComplexTypeMapping.cs
- Pair.cs
- XmlImplementation.cs
- WebPermission.cs
- StringTraceRecord.cs
- MessageSmuggler.cs
- RuntimeConfigLKG.cs
- MobileSysDescriptionAttribute.cs
- BindingsSection.cs
- CommandBindingCollection.cs
- SqlCacheDependency.cs
- HtmlEncodedRawTextWriter.cs
- ProtocolsConfigurationHandler.cs
- Command.cs
- ActivityMarkupSerializationProvider.cs
- BuildDependencySet.cs
- PageContentCollection.cs
- BooleanConverter.cs
- HttpWriter.cs
- BitmapEffectOutputConnector.cs
- ChameleonKey.cs
- CachedTypeface.cs
- MailBnfHelper.cs
- ByeMessageApril2005.cs
- XmlWhitespace.cs
- SyntaxCheck.cs
- Error.cs
- LabelDesigner.cs
- WindowsListViewItemCheckBox.cs
- CheckBoxField.cs
- DataMemberConverter.cs
- ArcSegment.cs
- StaticContext.cs
- BorderSidesEditor.cs
- RefType.cs
- PageParser.cs
- DeviceSpecific.cs
- XmlWrappingReader.cs
- NonParentingControl.cs