// 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)); }
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)); }
//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)); }
// 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)); }
// 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)); }