Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / OleAutBinder.cs / 1305376 / OleAutBinder.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // This class represents the Ole Automation binder. // #define DISPLAY_DEBUG_INFO namespace System { using System; using System.Runtime.InteropServices; using System.Reflection; using Microsoft.Win32; using CultureInfo = System.Globalization.CultureInfo; // Made serializable in anticipation of this class eventually having state. [Serializable] internal class OleAutBinder : DefaultBinder { // ChangeType // This binder uses OLEAUT to change the type of the variant. [System.Security.SecuritySafeCritical] // overrides transparent member public override Object ChangeType(Object value, Type type, CultureInfo cultureInfo) { Variant myValue = new Variant(value); if (cultureInfo == null) cultureInfo = CultureInfo.CurrentCulture; #if DISPLAY_DEBUG_INFO Console.Write("In OleAutBinder::ChangeType converting variant of type: "); Console.Write(myValue.VariantType); Console.Write(" to type: "); Console.WriteLine(type.Name); #endif if (type.IsByRef) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Striping byref from the type to convert to."); #endif type = type.GetElementType(); } // If we are trying to convert from an object to another type then we don't // need the OLEAUT change type, we can just use the normal COM+ mechanisms. if (!type.IsPrimitive && type.IsInstanceOfType(value)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Source variant can be assigned to destination type"); #endif return value; } Type srcType = value.GetType(); // Handle converting primitives to enums. if (type.IsEnum && srcType.IsPrimitive) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Converting primitive to enum"); #endif return Enum.Parse(type, value.ToString()); } #if !FEATURE_CORECLR // Special case the convertion from DBNull. if (srcType == typeof(DBNull)) { // The requested type is a DBNull so no convertion is required. if (type == typeof(DBNull)) return value; // Visual J++ supported converting from DBNull to null so customers // have requested (via a CDCR) that DBNull be convertible to null. // We don't however allow this when converting to a value class, since null // doesn't make sense for these, or to object since this would change existing // semantics. if ((type.IsClass && type != typeof(Object)) || type.IsInterface) return null; } #endif //!FEATURE_CORECLR #if FEATURE_COMINTEROP // Use the OA variant lib to convert primitive types. try { #if DISPLAY_DEBUG_INFO Console.WriteLine("Using OAVariantLib.ChangeType() to do the conversion"); #endif // Specify the LocalBool flag to have BOOL values converted to local language rather // than 0 or -1. Object RetObj = OAVariantLib.ChangeType(myValue, type, OAVariantLib.LocalBool, cultureInfo).ToObject(); #if DISPLAY_DEBUG_INFO Console.WriteLine("Object returned from ChangeType is of type: " + RetObj.GetType().Name); #endif return RetObj; } #if DISPLAY_DEBUG_INFO catch(NotSupportedException e) #else catch(NotSupportedException) #endif { #if DISPLAY_DEBUG_INFO Console.Write("Exception thrown: "); Console.WriteLine(e); #endif throw new COMException(Environment.GetResourceString("Interop.COM_TypeMismatch"), unchecked((int)0x80020005)); } #else // !FEATURE_COMINTEROP return base.ChangeType(value, type, cultureInfo); #endif // !FEATURE_COMINTEROP } #if !FEATURE_COMINTEROP // CanChangeType public override bool CanChangeType(Object value, Type type, CultureInfo cultureInfo) { Variant myValue = new Variant(value); if (cultureInfo == null) cultureInfo = CultureInfo.CurrentCulture; #if DISPLAY_DEBUG_INFO Console.Write("In OleAutBinder::CanChangeType converting variant of type: "); Console.Write(myValue.VariantType); Console.Write(" to type: "); Console.WriteLine(type.Name); #endif // If we are trying to convert to variant then there is nothing to do. if (type == typeof(Variant)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Variant being changed to type variant is always legal"); #endif return true; } if (type.IsByRef) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Striping byref from the type to convert to."); #endif type = type.GetElementType(); } // If we are trying to convert from an object to another type then we don't // need the OLEAUT change type, we can just use the normal COM+ mechanisms. if (!type.IsPrimitive && type.IsInstanceOfType(value)) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Source variant can be assigned to destination type"); #endif return true; } // Handle converting primitives to enums. if (type.IsEnum && value.GetType().IsPrimitive) { #if DISPLAY_DEBUG_INFO Console.WriteLine("Converting primitive to enum"); #endif return true; } return base.CanChangeType(value, type, cultureInfo); } #endif // FEATURE_COMINTEROP } } // 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
- SqlTransaction.cs
- EllipticalNodeOperations.cs
- ResourcesBuildProvider.cs
- ImageMapEventArgs.cs
- KeyGestureValueSerializer.cs
- TreeWalkHelper.cs
- SqlDataSourceView.cs
- XmlSchemaDatatype.cs
- AttachedPropertyBrowsableAttribute.cs
- MultiTrigger.cs
- EditingScope.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- CacheVirtualItemsEvent.cs
- WebBrowserPermission.cs
- DescendantQuery.cs
- HtmlControlPersistable.cs
- PropertyPushdownHelper.cs
- BaseTemplateParser.cs
- SqlXml.cs
- PreviewPageInfo.cs
- DetailsViewInsertedEventArgs.cs
- RowVisual.cs
- WrappedKeySecurityToken.cs
- MenuStrip.cs
- SoapFormatter.cs
- EndpointFilterProvider.cs
- XmlObjectSerializerWriteContext.cs
- CompletedAsyncResult.cs
- SecureEnvironment.cs
- SystemWebSectionGroup.cs
- MultiBinding.cs
- IndexedString.cs
- _SpnDictionary.cs
- ReliabilityContractAttribute.cs
- ContentDesigner.cs
- TransformerInfo.cs
- MasterPageBuildProvider.cs
- TextEndOfSegment.cs
- XPathNodeInfoAtom.cs
- StringArrayEditor.cs
- PartialCachingControl.cs
- ToolboxItemCollection.cs
- LinqToSqlWrapper.cs
- BitmapMetadataBlob.cs
- GridItem.cs
- EffectiveValueEntry.cs
- OrderByLifter.cs
- XmlParserContext.cs
- ListBase.cs
- WorkflowFileItem.cs
- Vector3DAnimationBase.cs
- CachedResourceDictionaryExtension.cs
- Int32Storage.cs
- ConnectionManagementElementCollection.cs
- WebPartMenuStyle.cs
- CodeMethodReturnStatement.cs
- XmlAggregates.cs
- MexBindingElement.cs
- OleDbRowUpdatedEvent.cs
- CellPartitioner.cs
- HttpClientCertificate.cs
- WebServiceAttribute.cs
- Sorting.cs
- IntMinMaxAggregationOperator.cs
- XPathPatternParser.cs
- DesignerTransactionCloseEvent.cs
- DiagnosticsConfigurationHandler.cs
- XamlClipboardData.cs
- DeclarativeExpressionConditionDeclaration.cs
- MonthChangedEventArgs.cs
- RoamingStoreFileUtility.cs
- ClickablePoint.cs
- UpdateRecord.cs
- SerializerProvider.cs
- SectionRecord.cs
- WindowsProgressbar.cs
- FixedPageProcessor.cs
- DtcInterfaces.cs
- DefaultValueConverter.cs
- DesignTimeType.cs
- TraceContextEventArgs.cs
- AddInActivator.cs
- ScrollBar.cs
- COM2PictureConverter.cs
- SafeMILHandle.cs
- PlaceHolder.cs
- SystemColors.cs
- DispatcherHookEventArgs.cs
- Math.cs
- RequestChannel.cs
- PtsHost.cs
- ListViewItemSelectionChangedEvent.cs
- ArrangedElement.cs
- SystemParameters.cs
- ElementNotEnabledException.cs
- ValueTypeFixupInfo.cs
- AccessKeyManager.cs
- TargetException.cs
- StringAnimationUsingKeyFrames.cs
- HttpListenerContext.cs