Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AccessedThroughPropertyAttribute.cs
- EDesignUtil.cs
- LayoutEngine.cs
- AuthenticationModulesSection.cs
- ParameterRefs.cs
- KeyTimeConverter.cs
- SQLInt64Storage.cs
- WhitespaceRule.cs
- XPathNodeList.cs
- XmlSerializationWriter.cs
- InstanceCreationEditor.cs
- SystemInfo.cs
- DeviceContext2.cs
- FormViewDeletedEventArgs.cs
- Comparer.cs
- ObjectParameter.cs
- FixedSchema.cs
- NamespaceEmitter.cs
- XmlC14NWriter.cs
- CompilationRelaxations.cs
- BatchStream.cs
- RowVisual.cs
- RequestContextBase.cs
- ProcessThreadDesigner.cs
- Internal.cs
- WebPartAuthorizationEventArgs.cs
- InvalidComObjectException.cs
- ValidationService.cs
- ArrayList.cs
- ImmComposition.cs
- TraceProvider.cs
- Expression.cs
- DataGridHeaderBorder.cs
- InlineObject.cs
- Transform3D.cs
- RecordBuilder.cs
- PropertyEmitter.cs
- TextContainerChangedEventArgs.cs
- SiteMapProvider.cs
- UpdatePanelTrigger.cs
- TargetException.cs
- IgnoreFlushAndCloseStream.cs
- InvalidOleVariantTypeException.cs
- TextRenderer.cs
- Char.cs
- ColorAnimation.cs
- OperationResponse.cs
- _UriTypeConverter.cs
- WorkerRequest.cs
- LogEntryHeaderv1Deserializer.cs
- ConnectionStringsExpressionBuilder.cs
- OSFeature.cs
- HorizontalAlignConverter.cs
- TriggerActionCollection.cs
- ToolStripProgressBar.cs
- ActivityPropertyReference.cs
- XpsFixedPageReaderWriter.cs
- SafeWaitHandle.cs
- HtmlControl.cs
- Transform.cs
- SerialErrors.cs
- Walker.cs
- SamlDelegatingWriter.cs
- TypeSystemProvider.cs
- GZipStream.cs
- VideoDrawing.cs
- ToolStripDesignerAvailabilityAttribute.cs
- DataGridViewColumnCollection.cs
- DataGridAutoFormatDialog.cs
- DrawingAttributeSerializer.cs
- HatchBrush.cs
- NameValueSectionHandler.cs
- PeerResolverElement.cs
- CalendarDay.cs
- ApplicationProxyInternal.cs
- Identity.cs
- CqlIdentifiers.cs
- DataViewManager.cs
- MsmqIntegrationMessagePool.cs
- MissingManifestResourceException.cs
- ThreadStateException.cs
- EventSourceCreationData.cs
- RegexBoyerMoore.cs
- LinearKeyFrames.cs
- TableProviderWrapper.cs
- ComponentChangedEvent.cs
- XPathSingletonIterator.cs
- ListViewCommandEventArgs.cs
- ValidationVisibilityAttribute.cs
- WindowsAltTab.cs
- AssemblyAttributesGoHere.cs
- ConfigXmlAttribute.cs
- IndexedEnumerable.cs
- PageCatalogPart.cs
- CornerRadius.cs
- DataGridViewBand.cs
- MimeParameterWriter.cs
- WebPartHeaderCloseVerb.cs
- UserNameSecurityToken.cs
- NonceToken.cs