Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / AddIn / AddIn / System / Addin / Hosting / Store / PipelineComponent.cs / 1305376 / PipelineComponent.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: PipelineComponent ** ** Purpose: Base class representing parts of the add-in ** pipeline, from the host to the contract to the addin. ** ===========================================================*/ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Text; using System.Diagnostics; using System.AddIn.MiniReflection; using System.AddIn.Pipeline; using System.Diagnostics.Contracts; namespace System.AddIn { [Serializable] internal enum PipelineComponentType { HostAdapter, Contract, AddInAdapter, AddInBase, AddIn } [Serializable] internal abstract class PipelineComponent { private TypeInfo _typeInfo; private String _location; // fully qualified path, known after deserialization private String _relativeLocation; // relative to the add-in root or pipeline root. private bool _connectedToNeighbors; private bool _haveSetRootDirectory; // Whether the add-in root or pipeline root has been set. // Since these dictionaries are read-only after initialization and they are often empty, // a perf optimization is to have the empty ones be shared. private IDictionary_qualificationData; internal static readonly IDictionary s_emptyDictionary = new ReadOnlyDictionary (new Dictionary ()); private static Type s_IContractInReflectionLoaderContext; private static Type s_ContractAttrInReflectionLoaderContext; private static Type s_AddInAdapterAttrInReflectionLoaderContext; private static Type s_AddInBaseAttrInReflectionLoaderContext; private static Type s_AddInAttrInReflectionLoaderContext; private static Type s_QualificationDataAttrInReflectionLoaderContext; internal PipelineComponent(TypeInfo typeInfo, String assemblyLocation) { if (typeInfo == null) throw new ArgumentNullException("typeInfo"); if (assemblyLocation == null) throw new ArgumentNullException("assemblyLocation"); System.Diagnostics.Contracts.Contract.EndContractBlock(); _typeInfo = typeInfo; if (Path.IsPathRooted(assemblyLocation)) { // For FindAddIn case, we know the full location; _location = assemblyLocation; _haveSetRootDirectory = true; } else { _relativeLocation = assemblyLocation; } // load the qualification data, either from reflection or minireflection, as appropriate if (_typeInfo.HasReflectionType) { IList cas =CustomAttributeData.GetCustomAttributes(_typeInfo.ReflectionType); Dictionary dictionary = new Dictionary (); foreach (CustomAttributeData ca in cas) { if (Object.ReferenceEquals(ca.Constructor.DeclaringType, s_QualificationDataAttrInReflectionLoaderContext)) { IList args = ca.ConstructorArguments; String key = (String)args[0].Value; String val = (String)args[1].Value; dictionary[key] = val; } } _qualificationData = dictionary.Count == 0 ? s_emptyDictionary : new ReadOnlyDictionary (dictionary); } else { Type qualificationDataAttribute = typeof (QualificationDataAttribute); MiniCustomAttributeInfo[] cas = typeInfo.GetCustomAttributeInfos(qualificationDataAttribute); Dictionary dictionary = new Dictionary (); if (cas != null && cas.Length > 0) { foreach (MiniCustomAttributeInfo ca in cas) { MiniCustomAttributeFixedArgInfo[] fai = ca.FixedArgs; String key = (String)fai[0].Value; String val = (String)fai[1].Value; dictionary[key] = val; } } _qualificationData = dictionary.Count == 0 ? s_emptyDictionary : new ReadOnlyDictionary (dictionary); } } internal IDictionary QualificationData { get { return _qualificationData; } } protected static Type IContractInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_IContractInReflectionLoaderContext != null); return s_IContractInReflectionLoaderContext; } } internal static Type ContractAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_ContractAttrInReflectionLoaderContext != null); return s_ContractAttrInReflectionLoaderContext; } } internal static Type AddInAdapterAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInAdapterAttrInReflectionLoaderContext != null); return s_AddInAdapterAttrInReflectionLoaderContext; } } internal static Type AddInBaseAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInBaseAttrInReflectionLoaderContext != null); return s_AddInBaseAttrInReflectionLoaderContext; } } internal static Type AddInAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInAttrInReflectionLoaderContext != null); return s_AddInAttrInReflectionLoaderContext; } } internal static void SetTypesFromReflectionLoaderContext(System.Reflection.Assembly systemAddInInReflLoaderContext, System.Reflection.Assembly systemAddInContractsInReflLoaderContext) { System.Diagnostics.Contracts.Contract.Requires(systemAddInInReflLoaderContext != null); System.Diagnostics.Contracts.Contract.Requires(systemAddInInReflLoaderContext.ReflectionOnly); System.Diagnostics.Contracts.Contract.Requires(systemAddInContractsInReflLoaderContext != null); System.Diagnostics.Contracts.Contract.Requires(systemAddInContractsInReflLoaderContext.ReflectionOnly); s_IContractInReflectionLoaderContext = systemAddInContractsInReflLoaderContext.GetType(typeof(System.AddIn.Contract.IContract).FullName, true); s_ContractAttrInReflectionLoaderContext =systemAddInContractsInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInContractAttribute", true); s_QualificationDataAttrInReflectionLoaderContext = systemAddInContractsInReflLoaderContext.GetType("System.AddIn.Pipeline.QualificationDataAttribute", true); s_AddInAdapterAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInAdapterAttribute", true); s_AddInBaseAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInBaseAttribute", true); s_AddInAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.AddInAttribute", true); } internal void SetRootDirectory(String root) { System.Diagnostics.Contracts.Contract.Requires(Path.IsPathRooted(root)); // Note that the same pipeline component may show up in multiple pipelines, // and we can't do this operation twice. if (!_haveSetRootDirectory) { System.Diagnostics.Contracts.Contract.Assert(!Path.IsPathRooted(_relativeLocation)); _location = Path.Combine(root, _relativeLocation); _haveSetRootDirectory = true; } } public String Location { get { System.Diagnostics.Contracts.Contract.Assert(_haveSetRootDirectory, "You must set this component's root directory before getting an absolute path. Either call SetRootDirectory or use RelativeLocation instead."); return _location; } } internal String RelativeLocation { get { return _relativeLocation; } } protected String BestAvailableLocation { get { System.Diagnostics.Contracts.Contract.Ensures(System.Diagnostics.Contracts.Contract.Result () != null); if (_haveSetRootDirectory) return _location; return _relativeLocation; } } public String Name { get { System.Diagnostics.Contracts.Contract.Ensures(System.Diagnostics.Contracts.Contract.Result () != null); return _typeInfo.Name; } } public TypeInfo TypeInfo { get { return _typeInfo; } } public String FullName { get { return _typeInfo.FullName; } } public bool ConnectedToNeighbors { get { return _connectedToNeighbors; } set { _connectedToNeighbors = value; } } // @ internal virtual bool Validate(Type type, Collection warnings) { return Validate(new TypeInfo(type), warnings); } // Finish the initialization, and ensure this type is a valid component // for use in the add-in model. On failure, log a message & return false. // Derived classes should do their own validation and then call this one. internal virtual bool Validate(TypeInfo type, Collection warnings) { if (type.IsGeneric) { warnings.Add(String.Format(System.Globalization.CultureInfo.CurrentCulture, Res.ComponentUnusableBecauseItIsGeneric, type.Name)); return false; } return true; } // used in AddIn class and HostAdapter class // Since MiniReflection doesn't support generics, we do a "best effort" while generating this list. [System.Security.SecuritySafeCritical] internal static TypeInfo[] FindBaseTypesAndInterfaces(TypeInfo type) { TypeInfo currentTypeInfo = type; TypeInfo objectType = new TypeInfo(typeof(Object)); List infos = new List (); try { //we walk up the hierarchy as far as we can until we can't //get the types anymore... while (!currentTypeInfo.Equals(objectType)) { // To get the base type and interfaces, we will need to resolve a TypeRef to a TypeDef first currentTypeInfo = currentTypeInfo.TryGetTypeDef(); if (currentTypeInfo != null) { TypeInfo[] interfaces = currentTypeInfo.GetInterfaces(); if (interfaces != null) infos.AddRange(interfaces); TypeInfo baseType = currentTypeInfo.BaseType; infos.Add(baseType); currentTypeInfo = baseType; } else { // we have reached the limit of what we can resolve in the addin/hostadapter's folder break; } } } catch (GenericsNotImplementedException) { // Since GetInterfaces() ignores all generic interfaces, we'll only come here if we encounter a generic base class. // We'll ignore the generic base class and return whatever bases we found earlier. } return infos.ToArray(); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** Class: PipelineComponent ** ** Purpose: Base class representing parts of the add-in ** pipeline, from the host to the contract to the addin. ** ===========================================================*/ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Reflection; using System.Security; using System.Security.Permissions; using System.Text; using System.Diagnostics; using System.AddIn.MiniReflection; using System.AddIn.Pipeline; using System.Diagnostics.Contracts; namespace System.AddIn { [Serializable] internal enum PipelineComponentType { HostAdapter, Contract, AddInAdapter, AddInBase, AddIn } [Serializable] internal abstract class PipelineComponent { private TypeInfo _typeInfo; private String _location; // fully qualified path, known after deserialization private String _relativeLocation; // relative to the add-in root or pipeline root. private bool _connectedToNeighbors; private bool _haveSetRootDirectory; // Whether the add-in root or pipeline root has been set. // Since these dictionaries are read-only after initialization and they are often empty, // a perf optimization is to have the empty ones be shared. private IDictionary _qualificationData; internal static readonly IDictionary s_emptyDictionary = new ReadOnlyDictionary (new Dictionary ()); private static Type s_IContractInReflectionLoaderContext; private static Type s_ContractAttrInReflectionLoaderContext; private static Type s_AddInAdapterAttrInReflectionLoaderContext; private static Type s_AddInBaseAttrInReflectionLoaderContext; private static Type s_AddInAttrInReflectionLoaderContext; private static Type s_QualificationDataAttrInReflectionLoaderContext; internal PipelineComponent(TypeInfo typeInfo, String assemblyLocation) { if (typeInfo == null) throw new ArgumentNullException("typeInfo"); if (assemblyLocation == null) throw new ArgumentNullException("assemblyLocation"); System.Diagnostics.Contracts.Contract.EndContractBlock(); _typeInfo = typeInfo; if (Path.IsPathRooted(assemblyLocation)) { // For FindAddIn case, we know the full location; _location = assemblyLocation; _haveSetRootDirectory = true; } else { _relativeLocation = assemblyLocation; } // load the qualification data, either from reflection or minireflection, as appropriate if (_typeInfo.HasReflectionType) { IList cas =CustomAttributeData.GetCustomAttributes(_typeInfo.ReflectionType); Dictionary dictionary = new Dictionary (); foreach (CustomAttributeData ca in cas) { if (Object.ReferenceEquals(ca.Constructor.DeclaringType, s_QualificationDataAttrInReflectionLoaderContext)) { IList args = ca.ConstructorArguments; String key = (String)args[0].Value; String val = (String)args[1].Value; dictionary[key] = val; } } _qualificationData = dictionary.Count == 0 ? s_emptyDictionary : new ReadOnlyDictionary (dictionary); } else { Type qualificationDataAttribute = typeof (QualificationDataAttribute); MiniCustomAttributeInfo[] cas = typeInfo.GetCustomAttributeInfos(qualificationDataAttribute); Dictionary dictionary = new Dictionary (); if (cas != null && cas.Length > 0) { foreach (MiniCustomAttributeInfo ca in cas) { MiniCustomAttributeFixedArgInfo[] fai = ca.FixedArgs; String key = (String)fai[0].Value; String val = (String)fai[1].Value; dictionary[key] = val; } } _qualificationData = dictionary.Count == 0 ? s_emptyDictionary : new ReadOnlyDictionary (dictionary); } } internal IDictionary QualificationData { get { return _qualificationData; } } protected static Type IContractInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_IContractInReflectionLoaderContext != null); return s_IContractInReflectionLoaderContext; } } internal static Type ContractAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_ContractAttrInReflectionLoaderContext != null); return s_ContractAttrInReflectionLoaderContext; } } internal static Type AddInAdapterAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInAdapterAttrInReflectionLoaderContext != null); return s_AddInAdapterAttrInReflectionLoaderContext; } } internal static Type AddInBaseAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInBaseAttrInReflectionLoaderContext != null); return s_AddInBaseAttrInReflectionLoaderContext; } } internal static Type AddInAttributeInReflectionLoaderContext { get { System.Diagnostics.Contracts.Contract.Assert(s_AddInAttrInReflectionLoaderContext != null); return s_AddInAttrInReflectionLoaderContext; } } internal static void SetTypesFromReflectionLoaderContext(System.Reflection.Assembly systemAddInInReflLoaderContext, System.Reflection.Assembly systemAddInContractsInReflLoaderContext) { System.Diagnostics.Contracts.Contract.Requires(systemAddInInReflLoaderContext != null); System.Diagnostics.Contracts.Contract.Requires(systemAddInInReflLoaderContext.ReflectionOnly); System.Diagnostics.Contracts.Contract.Requires(systemAddInContractsInReflLoaderContext != null); System.Diagnostics.Contracts.Contract.Requires(systemAddInContractsInReflLoaderContext.ReflectionOnly); s_IContractInReflectionLoaderContext = systemAddInContractsInReflLoaderContext.GetType(typeof(System.AddIn.Contract.IContract).FullName, true); s_ContractAttrInReflectionLoaderContext =systemAddInContractsInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInContractAttribute", true); s_QualificationDataAttrInReflectionLoaderContext = systemAddInContractsInReflLoaderContext.GetType("System.AddIn.Pipeline.QualificationDataAttribute", true); s_AddInAdapterAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInAdapterAttribute", true); s_AddInBaseAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.Pipeline.AddInBaseAttribute", true); s_AddInAttrInReflectionLoaderContext = systemAddInInReflLoaderContext.GetType("System.AddIn.AddInAttribute", true); } internal void SetRootDirectory(String root) { System.Diagnostics.Contracts.Contract.Requires(Path.IsPathRooted(root)); // Note that the same pipeline component may show up in multiple pipelines, // and we can't do this operation twice. if (!_haveSetRootDirectory) { System.Diagnostics.Contracts.Contract.Assert(!Path.IsPathRooted(_relativeLocation)); _location = Path.Combine(root, _relativeLocation); _haveSetRootDirectory = true; } } public String Location { get { System.Diagnostics.Contracts.Contract.Assert(_haveSetRootDirectory, "You must set this component's root directory before getting an absolute path. Either call SetRootDirectory or use RelativeLocation instead."); return _location; } } internal String RelativeLocation { get { return _relativeLocation; } } protected String BestAvailableLocation { get { System.Diagnostics.Contracts.Contract.Ensures(System.Diagnostics.Contracts.Contract.Result () != null); if (_haveSetRootDirectory) return _location; return _relativeLocation; } } public String Name { get { System.Diagnostics.Contracts.Contract.Ensures(System.Diagnostics.Contracts.Contract.Result () != null); return _typeInfo.Name; } } public TypeInfo TypeInfo { get { return _typeInfo; } } public String FullName { get { return _typeInfo.FullName; } } public bool ConnectedToNeighbors { get { return _connectedToNeighbors; } set { _connectedToNeighbors = value; } } // @ internal virtual bool Validate(Type type, Collection warnings) { return Validate(new TypeInfo(type), warnings); } // Finish the initialization, and ensure this type is a valid component // for use in the add-in model. On failure, log a message & return false. // Derived classes should do their own validation and then call this one. internal virtual bool Validate(TypeInfo type, Collection warnings) { if (type.IsGeneric) { warnings.Add(String.Format(System.Globalization.CultureInfo.CurrentCulture, Res.ComponentUnusableBecauseItIsGeneric, type.Name)); return false; } return true; } // used in AddIn class and HostAdapter class // Since MiniReflection doesn't support generics, we do a "best effort" while generating this list. [System.Security.SecuritySafeCritical] internal static TypeInfo[] FindBaseTypesAndInterfaces(TypeInfo type) { TypeInfo currentTypeInfo = type; TypeInfo objectType = new TypeInfo(typeof(Object)); List infos = new List (); try { //we walk up the hierarchy as far as we can until we can't //get the types anymore... while (!currentTypeInfo.Equals(objectType)) { // To get the base type and interfaces, we will need to resolve a TypeRef to a TypeDef first currentTypeInfo = currentTypeInfo.TryGetTypeDef(); if (currentTypeInfo != null) { TypeInfo[] interfaces = currentTypeInfo.GetInterfaces(); if (interfaces != null) infos.AddRange(interfaces); TypeInfo baseType = currentTypeInfo.BaseType; infos.Add(baseType); currentTypeInfo = baseType; } else { // we have reached the limit of what we can resolve in the addin/hostadapter's folder break; } } } catch (GenericsNotImplementedException) { // Since GetInterfaces() ignores all generic interfaces, we'll only come here if we encounter a generic base class. // We'll ignore the generic base class and return whatever bases we found earlier. } return infos.ToArray(); } } } // 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
- WebPageTraceListener.cs
- InternalMappingException.cs
- DataListItem.cs
- DeferredSelectedIndexReference.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- FileIOPermission.cs
- PropertySegmentSerializer.cs
- BitmapEffectState.cs
- ModuleBuilder.cs
- PropertyValueChangedEvent.cs
- ToolStripPanelCell.cs
- TrackPointCollection.cs
- UniqueIdentifierService.cs
- PaintEvent.cs
- TickBar.cs
- MembershipPasswordException.cs
- SocketStream.cs
- DBParameter.cs
- DataGridViewTopLeftHeaderCell.cs
- SessionStateUtil.cs
- cookiecollection.cs
- PropertyDescriptorCollection.cs
- DatagridviewDisplayedBandsData.cs
- Crc32.cs
- ApplicationManager.cs
- Effect.cs
- MD5CryptoServiceProvider.cs
- CompilerWrapper.cs
- TabControl.cs
- ItemContainerPattern.cs
- WebServiceFault.cs
- XmlChildEnumerator.cs
- CodeDirectionExpression.cs
- BindableAttribute.cs
- EmbeddedMailObjectCollectionEditor.cs
- TypeContext.cs
- VectorKeyFrameCollection.cs
- TextSelectionProcessor.cs
- Atom10FormatterFactory.cs
- JsonServiceDocumentSerializer.cs
- SQLGuidStorage.cs
- BindingExpression.cs
- ManagementNamedValueCollection.cs
- SymLanguageVendor.cs
- MeasurementDCInfo.cs
- FixedPageStructure.cs
- UserMapPath.cs
- SapiAttributeParser.cs
- ErrorHandler.cs
- ConstraintStruct.cs
- Rights.cs
- ConfigPathUtility.cs
- MsmqSecureHashAlgorithm.cs
- TypedDataSetSchemaImporterExtensionFx35.cs
- UITypeEditor.cs
- FlowLayoutSettings.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- FieldBuilder.cs
- ChildrenQuery.cs
- ExpressionBuilderContext.cs
- SrgsRule.cs
- PrintPreviewGraphics.cs
- Keywords.cs
- CopyAction.cs
- Helpers.cs
- Environment.cs
- DecimalFormatter.cs
- PrintingPermissionAttribute.cs
- ListViewItem.cs
- MappingModelBuildProvider.cs
- PriorityItem.cs
- DataColumnMapping.cs
- Permission.cs
- ProcessInfo.cs
- _IPv4Address.cs
- UnauthorizedAccessException.cs
- rsa.cs
- StringWriter.cs
- PrimitiveDataContract.cs
- DBParameter.cs
- NavigationWindowAutomationPeer.cs
- XmlReflectionMember.cs
- RelationshipDetailsCollection.cs
- ResourceReader.cs
- BitmapScalingModeValidation.cs
- ButtonColumn.cs
- EmptyTextWriter.cs
- SubMenuStyleCollection.cs
- EdmTypeAttribute.cs
- CookielessHelper.cs
- __FastResourceComparer.cs
- Light.cs
- ClickablePoint.cs
- IISMapPath.cs
- CloseSequenceResponse.cs
- FixUp.cs
- WorkflowInstanceExtensionCollection.cs
- ArrayConverter.cs
- SettingsPropertyWrongTypeException.cs
- ListenerElementsCollection.cs