protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx) { if (Parent != null && ExtensionBuilder != null) { // all dependencies that might be declared in other addins has been retrieved. if (Head.SiblingId != null && Sibling != null) { return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling)); } if (Head.SiblingId == null) { return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent)); } } if (Parent == null) { ExtensionPointResolution epResolution; if (!ctx.TryGetExtensionPoint(resolutionResult, Head.ParentPath, out epResolution)) { ExtensionResolution exResolution; if (!ctx.TryGetExtension(resolutionResult, Head.ParentPath, out exResolution)) { resolutionResult.AddError(string.Format("Can not find the parent of the specified extension [{0}] with path [{1}]!", Head.Path, Head.ParentPath)); return(ResolutionStatus.Failed); } if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin)) { if (exResolution.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success) { return(exResolution.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。 } DeclaringAddin.AddExtendedAddin(exResolution.DeclaringAddin); } //if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin)) //{ var ep = GetExtensionPointFor(exResolution); if (ep == null) { return(ResolutionStatus.Pending); // the extension point is probably not available right now. } DeclaringAddin.AddExtendedExtensionPoint(ep); //} Parent = exResolution; } else { if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin)) { if (epResolution.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success) { return(epResolution.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。 } DeclaringAddin.AddExtendedAddin(epResolution.DeclaringAddin); } //if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin)) DeclaringAddin.AddExtendedExtensionPoint(epResolution); Parent = epResolution; } } if (ExtensionBuilder == null) { ExtensionBuilderResolution eb; // the extension builder might be declared in: // 1. the same addin where this extension is declared or other affected addins (use the uid to get the extension builder directly) // 2. an updated addin (use the uid to get the extension builder path, and then use that path to get the extension builder) if (!ctx.TryGetExtensionBuilder(resolutionResult, Head.ExtensionBuilderUid, out eb)) { string extensionBuilderPath; if (!ctx.TryGetExtensionBuilderPath(resolutionResult, Head.ExtensionBuilderUid, out extensionBuilderPath)) { return(ResolutionStatus.Failed); } if (!ctx.TryGetExtensionBuilder(resolutionResult, extensionBuilderPath, out eb)) { return(ResolutionStatus.Failed); } } // The type of extension builder must be loaded before this extension, and it might not defined in the same // addin as current extension (ex), so we needs to add its declaring addin as a reference. // !!!Note that the extension point type, as well as extension type (T of IExtensionBuilder<T> implmentation) // must be loaded before this extension too, but we'll let the extension builder to reference them. if (!ReferenceEquals(eb.DeclaringAddin, DeclaringAddin)) { if (eb.Type == null) { return(ResolutionStatus.Pending); } if (!ReferenceEquals(eb.Type.Assembly.DeclaringAddin, DeclaringAddin)) { AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(eb.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } } ExtensionBuilder = eb; } if (Head.SiblingId != null && Sibling == null) { ExtensionResolution sibling; if (!ctx.TryGetExtension(resolutionResult, Head.SiblingPath, out sibling)) { resolutionResult.AddError(string.Format("Can not find the sibling extension of the specified extension [{0}] with path [{1}]!", Head.Path, Head.SiblingPath)); return(ResolutionStatus.Failed); } // The metadata of the sibling extension must be loaded before this extension, so we needs to add its declaring // addin as a dependency. if (!ReferenceEquals(sibling.DeclaringAddin, DeclaringAddin)) { if (sibling.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success) { return(sibling.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。 } DeclaringAddin.AddExtendedAddin(sibling.DeclaringAddin); } Sibling = sibling; } if (!ApplyRules(resolutionResult, ctx, convertionManager)) { return(ResolutionStatus.Failed); } return(Sibling != null ? ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling) : ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent)); }
// The resolution of an extension builder depends on the existence of its implementation type // (IExtensionBuilder<TExtension> / ICompositeExtensionBuilder<TExtension>) and extension type (TExtension), // and it obey some rules. protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx) { // Tries to get the parent if (Parent == null) { //BaseExtensionPointResolution objParent; if (ParentIsExtensionPoint) { ExtensionPointResolution parent; if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent)) { resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath)); return(ResolutionStatus.Failed); } if (!ReferenceEquals(parent.DeclaringAddin, DeclaringAddin)) { if (parent.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success) { return(parent.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。 } if (parent.Type == null) { return(ResolutionStatus.Pending); } // The parent of current extension builder is not defined in the same addin as it is, // so we needs to add its declaring addin as a reference (the type of the parent must // be loaded before this extension builder at start up). AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(parent.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } Parent = parent; DeclaringAddin.AddExtendedExtensionPoint(parent); //objParent = parent; } else { ExtensionBuilderResolution parent; if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent)) { resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath)); return(ResolutionStatus.Failed); } if (!ReferenceEquals(parent.DeclaringAddin, DeclaringAddin)) { if (parent.DeclaringAddin.ResolutionStatus != ResolutionStatus.Success) { return(parent.DeclaringAddin.ResolutionStatus); // 上级对象解析 failed,子对象解析就 failed。上级 pending,此处也是 pending。 } if (parent.Type == null) { return(ResolutionStatus.Pending); } // The parent of current extension builder is not defined in the same addin as it is, // so we needs to add its declaring addin as a reference (the type of the parent must // be loaded before this extension builder at start up). AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(parent.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } Parent = parent; var ep = GetExtensionPointFor(parent); if (ep == null) { return(ResolutionStatus.Pending); // the extension point is probably not available right now. } DeclaringAddin.AddExtendedExtensionPoint(ep); //objParent = parent; } } if (Type == null) { Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName); if (Type == null) { resolutionResult.AddError(string.Format("Can not find the specified extension builder type [{0}]!", TypeName)); return(ResolutionStatus.Failed); } TypeResolution extensionType; if (!ApplyRules(resolutionResult, ctx, out extensionType)) { return(ResolutionStatus.Failed); } ExtensionType = extensionType; if (Type.Assembly.DeclaringAddin != null && !ReferenceEquals(Type.Assembly.DeclaringAddin, DeclaringAddin)) { AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } } return(ResolveAddin(Parent) | ResolveType(Type)); }
// if we can find the referenced extension builder, the resolution is done. protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx) { // Tries to get the parent if (Parent == null) { BaseExtensionPointResolution objParent; if (ParentIsExtensionPoint) { ExtensionPointResolution parent; if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent)) { resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath)); return(ResolutionStatus.Failed); } Parent = parent; DeclaringAddin.AddExtendedExtensionPoint(parent); objParent = parent; } else { ExtensionBuilderResolution parent; if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent)) { resolutionResult.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath)); return(ResolutionStatus.Failed); } Parent = parent; var ep = GetExtensionPointFor(parent); if (ep == null) { return(ResolutionStatus.Pending); // the extension point is probably not available right now. } DeclaringAddin.AddExtendedExtensionPoint(ep); objParent = parent; } if (objParent.DeclaringAddin != null && !ReferenceEquals(objParent.DeclaringAddin, DeclaringAddin)) { if (objParent.Type == null) { return(ResolutionStatus.Pending); } // The parent of current extension builder is not defined in the same addin as it is, // so we needs to add its declaring addin as a reference (the type of the parent must // be loaded before this extension builder at start up). AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(objParent.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } } if (_referenced == null) { var referenced = TryFindReferencedExtensionBuilder(Parent, Name); if (referenced == null) { if (!ctx.TryGetExtensionBuilder(resolutionResult, Path, out referenced)) { return(ResolutionStatus.Failed); } } if (referenced.DeclaringAddin != null && !ReferenceEquals(referenced.DeclaringAddin, DeclaringAddin)) { if (referenced.Type == null) { return(ResolutionStatus.Pending); } // The parent of current extension builder is not defined in the same addin as it is, // so we needs to add its declaring addin as a reference (the type of the parent must // be loaded before this extension builder at start up). AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(referenced.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } _referenced = referenced; } return(ResolveAddin(Parent) | _referenced.Resolve(resolutionResult, convertionManager, ctx)); }
internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx) { if (Parent != null && ExtensionBuilder != null) { // all dependencies that might be declared in other addins has been retrieved. if (Head.SiblingId != null && Sibling != null) { return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling)); } if (Head.SiblingId == null) { return(ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent)); } } if (Parent == null) { ExtensionPointResolution epResolution; if (!ctx.TryGetExtensionPoint(dialog, Head.ParentPath, out epResolution)) { ExtensionResolution exResolution; if (!ctx.TryGetExtension(dialog, Head.ParentPath, out exResolution)) { return(ResolutionStatus.Failed); } if (!ReferenceEquals(exResolution.DeclaringAddin, DeclaringAddin)) { var ep = GetExtensionPointFor(exResolution); if (ep == null) { return(ResolutionStatus.Pending); // the extension point is probably not available right now. } DeclaringAddin.AddExtendedExtensionPoint(ep); } Parent = exResolution; } else { if (!ReferenceEquals(epResolution.DeclaringAddin, DeclaringAddin)) { DeclaringAddin.AddExtendedExtensionPoint(epResolution); } Parent = epResolution; } // The metadata of the parent (extension point or another extension) must be loaded before this extension, // so we needs to add its declaring addin as a dependency. if (!ReferenceEquals(Parent.DeclaringAddin, DeclaringAddin)) { DeclaringAddin.AddExtendedAddin(Parent.DeclaringAddin); } } if (ExtensionBuilder == null) { ExtensionBuilderResolution eb; // the extension builder might be declared in: // 1. the same addin where this extension is declared or other affected addins (use the uid to get the extension builder directly) // 2. an updated addin (use the uid to get the extension builder path, and then use that path to get the extension builder) if (!ctx.TryGetExtensionBuilder(dialog, Head.ExtensionBuilderUid, out eb)) { string extensionBuilderPath; if (!ctx.TryGetExtensionBuilderPath(dialog, Head.ExtensionBuilderUid, out extensionBuilderPath)) { return(ResolutionStatus.Failed); } if (!ctx.TryGetExtensionBuilder(dialog, extensionBuilderPath, out eb)) { return(ResolutionStatus.Failed); } } // The type of extension builder must be loaded before this extension, and it might not defined in the same // addin as current extension (ex), so we needs to add its declaring addin as a reference. // !!!Note that the extension point type must loaded before this extension too, but we'll let the extension // builder to refer to it. if (!ReferenceEquals(eb.DeclaringAddin, DeclaringAddin)) { if (eb.Type == null) { return(ResolutionStatus.Pending); } if (!ReferenceEquals(eb.Type.Assembly.DeclaringAddin, DeclaringAddin)) { AssemblyResolutionSet assemblySet; if (!ctx.TryGetAssemblySet(eb.Type.Assembly.AssemblyKey, out assemblySet)) { throw new Exception(); } DeclaringAddin.AddReferencedAssemblySet(assemblySet); } } ExtensionBuilder = eb; } if (Head.SiblingId != null && Sibling == null) { ExtensionResolution sibling; if (!ctx.TryGetExtension(dialog, Head.SiblingPath, out sibling)) { return(ResolutionStatus.Failed); } Sibling = sibling; // The metadata of the sibling extension must be loaded before this extension, so we needs to add its declaring // addin as a dependency. if (!ReferenceEquals(sibling.DeclaringAddin, DeclaringAddin)) { DeclaringAddin.AddExtendedAddin(sibling.DeclaringAddin); } } if (!ApplyRules(dialog, ctx, convertionManager)) { return(ResolutionStatus.Failed); } return(Sibling != null ? ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent) | ResolveAddin(Sibling) : ResolveAddin(ExtensionBuilder) | ResolveAddin(Parent)); }