Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / clr / src / BCL / System / Runtime / Serialization / TypeName.cs / 3 / TypeName.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: TypeName ** ** ** Purpose: Provides some static methods to aid with type loading ** when LoadWithPartialName is used with generics. ** ** ============================================================*/ namespace System.Runtime.Serialization { using System; using System.Reflection; using System.Globalization; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; class TypeName { [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), TypeLibType((short)0x100), Guid("B81FF171-20F3-11D2-8DCC-00A0C9B00522")] internal interface ITypeName { uint GetNameCount(); uint GetNames([In] uint count, IntPtr rgbszNamesArray); uint GetTypeArgumentCount(); uint GetTypeArguments([In] uint count, IntPtr rgpArgumentsArray); uint GetModifierLength(); uint GetModifiers([In] uint count, out uint rgModifiers); [return: MarshalAs(UnmanagedType.BStr)] string GetAssemblyName(); } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), TypeLibType((short)0x100), Guid("B81FF171-20F3-11D2-8DCC-00A0C9B00521")] internal interface ITypeNameFactory { [return: MarshalAs(UnmanagedType.Interface)] ITypeName ParseTypeName([In, MarshalAs(UnmanagedType.LPWStr)] string szName, out int pError); } private TypeName() { } internal static Type GetType(Assembly initialAssembly, string fullTypeName) { Type comType = Type.GetTypeFromCLSID(new Guid(0xB81FF171, 0x20F3, 0x11d2, 0x8d, 0xcc, 0x00, 0xa0, 0xc9, 0xb0, 0x05, 0x25)); ITypeNameFactory parser = (ITypeNameFactory)Activator.CreateInstance(comType); int error; ITypeName typeNameInfo = parser.ParseTypeName(fullTypeName, out error); Type t = null; if (error == -1) { t = LoadTypeWithPartialName(typeNameInfo, initialAssembly, fullTypeName); } return t; } static Type LoadTypeWithPartialName(ITypeName typeNameInfo, Assembly initialAssembly, string fullTypeName) { uint nameCount = typeNameInfo.GetNameCount(); uint argCount = typeNameInfo.GetTypeArgumentCount(); IntPtr[] names = new IntPtr[nameCount]; IntPtr[] args = new IntPtr[argCount]; try { Type baseType = null; if (nameCount != 0) { GCHandle gch = GCHandle.Alloc(names, GCHandleType.Pinned); nameCount = typeNameInfo.GetNames(nameCount, gch.AddrOfPinnedObject()); gch.Free(); string name = Marshal.PtrToStringBSTR(names[0]); string asmName = typeNameInfo.GetAssemblyName(); if (!String.IsNullOrEmpty(asmName)) { Assembly asm = Assembly.LoadWithPartialName(asmName); if (asm == null) { asm = Assembly.LoadWithPartialName(new AssemblyName(asmName).Name); } baseType = asm.GetType(name); } else { if (initialAssembly != null) { baseType = initialAssembly.GetType(name); } else baseType = Type.GetType(name); } if (baseType == null) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } for (int i = 1; i < nameCount; i++) { string nestedName = Marshal.PtrToStringBSTR(names[i]); baseType = baseType.GetNestedType(nestedName, BindingFlags.Public | BindingFlags.NonPublic); if (baseType == null) throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } } else { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } if (argCount != 0) { GCHandle gch = GCHandle.Alloc(args, GCHandleType.Pinned); argCount = typeNameInfo.GetTypeArguments(argCount, gch.AddrOfPinnedObject()); gch.Free(); Type[] typeArgs = new Type[argCount]; for (int i = 0; i < argCount; i++) { typeArgs[i] = LoadTypeWithPartialName((ITypeName)Marshal.GetObjectForIUnknown(args[i]), null, fullTypeName); } return baseType.MakeGenericType(typeArgs); } else { return baseType; } } finally { for (int i = 0; i < names.Length; i++) { if (names[i] != null) { Marshal.FreeBSTR(names[i]); } } for (int i = 0; i < args.Length; i++) { if (args[i] != null) { Marshal.Release(args[i]); } } } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: TypeName ** ** ** Purpose: Provides some static methods to aid with type loading ** when LoadWithPartialName is used with generics. ** ** ============================================================*/ namespace System.Runtime.Serialization { using System; using System.Reflection; using System.Globalization; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; class TypeName { [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), TypeLibType((short)0x100), Guid("B81FF171-20F3-11D2-8DCC-00A0C9B00522")] internal interface ITypeName { uint GetNameCount(); uint GetNames([In] uint count, IntPtr rgbszNamesArray); uint GetTypeArgumentCount(); uint GetTypeArguments([In] uint count, IntPtr rgpArgumentsArray); uint GetModifierLength(); uint GetModifiers([In] uint count, out uint rgModifiers); [return: MarshalAs(UnmanagedType.BStr)] string GetAssemblyName(); } [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), TypeLibType((short)0x100), Guid("B81FF171-20F3-11D2-8DCC-00A0C9B00521")] internal interface ITypeNameFactory { [return: MarshalAs(UnmanagedType.Interface)] ITypeName ParseTypeName([In, MarshalAs(UnmanagedType.LPWStr)] string szName, out int pError); } private TypeName() { } internal static Type GetType(Assembly initialAssembly, string fullTypeName) { Type comType = Type.GetTypeFromCLSID(new Guid(0xB81FF171, 0x20F3, 0x11d2, 0x8d, 0xcc, 0x00, 0xa0, 0xc9, 0xb0, 0x05, 0x25)); ITypeNameFactory parser = (ITypeNameFactory)Activator.CreateInstance(comType); int error; ITypeName typeNameInfo = parser.ParseTypeName(fullTypeName, out error); Type t = null; if (error == -1) { t = LoadTypeWithPartialName(typeNameInfo, initialAssembly, fullTypeName); } return t; } static Type LoadTypeWithPartialName(ITypeName typeNameInfo, Assembly initialAssembly, string fullTypeName) { uint nameCount = typeNameInfo.GetNameCount(); uint argCount = typeNameInfo.GetTypeArgumentCount(); IntPtr[] names = new IntPtr[nameCount]; IntPtr[] args = new IntPtr[argCount]; try { Type baseType = null; if (nameCount != 0) { GCHandle gch = GCHandle.Alloc(names, GCHandleType.Pinned); nameCount = typeNameInfo.GetNames(nameCount, gch.AddrOfPinnedObject()); gch.Free(); string name = Marshal.PtrToStringBSTR(names[0]); string asmName = typeNameInfo.GetAssemblyName(); if (!String.IsNullOrEmpty(asmName)) { Assembly asm = Assembly.LoadWithPartialName(asmName); if (asm == null) { asm = Assembly.LoadWithPartialName(new AssemblyName(asmName).Name); } baseType = asm.GetType(name); } else { if (initialAssembly != null) { baseType = initialAssembly.GetType(name); } else baseType = Type.GetType(name); } if (baseType == null) { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } for (int i = 1; i < nameCount; i++) { string nestedName = Marshal.PtrToStringBSTR(names[i]); baseType = baseType.GetNestedType(nestedName, BindingFlags.Public | BindingFlags.NonPublic); if (baseType == null) throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } } else { throw new SerializationException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_BadType"), fullTypeName)); } if (argCount != 0) { GCHandle gch = GCHandle.Alloc(args, GCHandleType.Pinned); argCount = typeNameInfo.GetTypeArguments(argCount, gch.AddrOfPinnedObject()); gch.Free(); Type[] typeArgs = new Type[argCount]; for (int i = 0; i < argCount; i++) { typeArgs[i] = LoadTypeWithPartialName((ITypeName)Marshal.GetObjectForIUnknown(args[i]), null, fullTypeName); } return baseType.MakeGenericType(typeArgs); } else { return baseType; } } finally { for (int i = 0; i < names.Length; i++) { if (names[i] != null) { Marshal.FreeBSTR(names[i]); } } for (int i = 0; i < args.Length; i++) { if (args[i] != null) { Marshal.Release(args[i]); } } } } } } // 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
- BooleanStorage.cs
- StyleTypedPropertyAttribute.cs
- Pts.cs
- TreeView.cs
- ACL.cs
- DataServiceRequestOfT.cs
- SystemResourceKey.cs
- ScriptDescriptor.cs
- ControllableStoryboardAction.cs
- PackUriHelper.cs
- TdsParserHelperClasses.cs
- SessionParameter.cs
- DetailsView.cs
- Vector3DCollectionConverter.cs
- SpeechSeg.cs
- VectorCollectionConverter.cs
- ProcessHostConfigUtils.cs
- GroupQuery.cs
- UrlMappingsModule.cs
- TextMetrics.cs
- RegisteredHiddenField.cs
- StringConcat.cs
- FilePrompt.cs
- MaxMessageSizeStream.cs
- SID.cs
- HtmlElement.cs
- QuaternionKeyFrameCollection.cs
- _ListenerAsyncResult.cs
- PathSegment.cs
- SynchronizationLockException.cs
- SafeNativeMethodsMilCoreApi.cs
- AssemblyBuilderData.cs
- ProxyHelper.cs
- QueryResponse.cs
- MenuItem.cs
- MergePropertyDescriptor.cs
- safePerfProviderHandle.cs
- BinaryMethodMessage.cs
- UrlMappingCollection.cs
- HandlerBase.cs
- BoolExpression.cs
- HostSecurityManager.cs
- UDPClient.cs
- FolderLevelBuildProviderCollection.cs
- TemplateParser.cs
- HtmlControlPersistable.cs
- SoapSchemaExporter.cs
- BezierSegment.cs
- StreamGeometry.cs
- RoutedEvent.cs
- TraceHandler.cs
- WebZone.cs
- ListDesigner.cs
- LocatorPartList.cs
- SubtreeProcessor.cs
- AutomationPeer.cs
- SafeFileMappingHandle.cs
- ColorKeyFrameCollection.cs
- BaseEntityWrapper.cs
- ListViewCancelEventArgs.cs
- DbParameterHelper.cs
- TypeValidationEventArgs.cs
- QilParameter.cs
- SearchForVirtualItemEventArgs.cs
- FtpWebRequest.cs
- HtmlString.cs
- DictionaryEntry.cs
- KeyMatchBuilder.cs
- EventToken.cs
- SwitchLevelAttribute.cs
- PersonalizationProvider.cs
- ContainsSearchOperator.cs
- PropertyPathWorker.cs
- WindowsIdentity.cs
- WebPartZoneBase.cs
- ChannelServices.cs
- DesignerVerbCollection.cs
- BlurBitmapEffect.cs
- RijndaelManagedTransform.cs
- BaseConfigurationRecord.cs
- GacUtil.cs
- CallContext.cs
- MD5.cs
- TableCell.cs
- DataConnectionHelper.cs
- PipeSecurity.cs
- QueryRewriter.cs
- ProgressChangedEventArgs.cs
- HeaderedItemsControl.cs
- ListViewCancelEventArgs.cs
- TreeNodeStyleCollection.cs
- MultiBinding.cs
- Command.cs
- NgenServicingAttributes.cs
- SimpleTypesSurrogate.cs
- TemplateControlBuildProvider.cs
- SQLDecimal.cs
- PenContext.cs
- ModelItemCollection.cs
- StylusButton.cs