// The resolution of an extension point depends on the existence of its implementation type (IExtensionPoint<TExtension, TRoot>),
        // extension type (TExtension) and root type (TRoot), and it needs to obey some rules.
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    resolutionResult.AddError(string.Format("Can not find the specified extension point type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType, extensionRootType;
                if (!ApplyRules(resolutionResult, ctx, out extensionType, out extensionRootType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType     = extensionType;
                ExtensionRootType = extensionRootType;

                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(ResolveType(Type));
        }
Пример #2
0
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    resolutionResult.AddError(string.Format("Can not find the specified addin activator type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                if (!ApplyRules(resolutionResult, ctx))
                {
                    return(ResolutionStatus.Failed);
                }

                //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(ResolveType(Type));
        }
Пример #3
0
        //internal override bool Equals(ExtensionBuilderResolution other) { throw new NotImplementedException(); }

        // just make sure all dependencies exists
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(resolutionResult, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (parent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    Parent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(resolutionResult, ParentPath, out parent))
                    {
                        return(ResolutionStatus.Failed);
                    }
                    if (parent.Type == null)
                    {
                        return(ResolutionStatus.Pending);
                    }
                    Parent = parent;
                }
            }

            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }
            }

            return(ResolveAddin(Parent));
        }
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType;
                if (!ApplyRules(dialog, ctx, out extensionType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType = extensionType;
            }

            return(ResolveType(Type));
        }
        protected override ResolutionStatus DoResolve(ResolutionResult resolutionResult, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType, extensionRootType;
                if (!ApplyRules(resolutionResult, ctx, out extensionType, out extensionRootType))
                {
                    return(ResolutionStatus.Failed);
                }
                ExtensionType     = extensionType;
                ExtensionRootType = extensionRootType;
            }

            return(ResolveType(Type));
        }
Пример #6
0
        // 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));
        }
Пример #7
0
        // 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.
        internal override ResolutionStatus Resolve(IMessageDialog dialog, ConvertionManager convertionManager, ResolutionContext ctx)
        {
            // Tries to get the parent
            if (Parent == null)
            {
                BaseExtensionPointResolution objParent;
                if (ParentIsExtensionPoint)
                {
                    ExtensionPointResolution parent;
                    if (!ctx.TryGetExtensionPoint(dialog, ParentPath, out parent))
                    {
                        dialog.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    objParent = parent;
                }
                else
                {
                    ExtensionBuilderResolution parent;
                    if (!ctx.TryGetExtensionBuilder(dialog, ParentPath, out parent))
                    {
                        dialog.AddError(string.Format("Can not find the parent of the specified extension builder [{0}] with path [{1}]!", TypeName, ParentPath));
                        return(ResolutionStatus.Failed);
                    }
                    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);
                }

                Parent = objParent;
            }

            if (Type == null)
            {
                Type = ctx.GetUniqueAddinType(DeclaringAddin, TypeName);
                if (Type == null)
                {
                    dialog.AddError(string.Format("Can not find the specified extension builder type [{0}]!", TypeName));
                    return(ResolutionStatus.Failed);
                }

                TypeResolution extensionType;
                if (!ApplyRules(dialog, 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));
        }