/// <summary> /// 构建插件。 /// </summary> /// <returns>代表了插件的对象,例如一个UI元素。</returns> public IAddin Build() { AddinBuildState state = BuildState; switch (state) { case AddinBuildState.Build: return(Addin); case AddinBuildState.NotBuild: return(GetInstance()); case AddinBuildState.DependecyFail: case AddinBuildState.LoadAssemblyFail: case AddinBuildState.LoadTypeFail: return(null); case AddinBuildState.NotAnalysis: Analysis(); return(GetInstance()); default: return(null); } }
/// <summary> /// 加载程序集。 /// </summary> private void LoadAssemblies() { AssemblyName aname = null; String fullName = null; Collection <String> unresoles = new Collection <String>(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); String file = null; foreach (String reference in References) { try { file = AddinManager.GetFileFullPath(reference); aname = AssemblyName.GetAssemblyName(file); fullName = aname.FullName; if (assemblies.Any(x => x.FullName == fullName)) { continue; } Assembly.LoadFrom(file); } catch (Exception) { unresoles.Add(file); } } if (unresoles.Count != 0) { BuildState = AddinBuildState.LoadAssemblyFail; throw new AddinAssembliesException(unresoles.ToArray()); } }
/// <summary> /// 创建插件实例。 /// </summary> /// <returns>插件实例。</returns> private IAddin GetInstance() { IAddin addin = (IAddin)Activator.CreateInstance(_type); addin.Initialize(); AddinDescriptors.Add(addin, this); Addin = addin; InitializeAddinState(); BuildState = AddinBuildState.Build; return(addin); }
/// <summary> /// 销毁插件实例。 /// </summary> public void Destroy() { if (BuildState == AddinBuildState.Build) { RemoveDependencies(); AddinDescriptors.Remove(Addin); Addin.Dispose(); Addin = null; BuildState = AddinBuildState.NotBuild; } }
/// <summary> /// 解析插件所需程序集列表。 /// </summary> private void AnalysisAssemblies() { if (References == null) { return; } LoadAssemblies(); Type type = System.Type.GetType(Type, (n) => { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); AssemblyName an = null; for (Int32 i = 0; i < assemblies.Length; i++) { an = assemblies[i].GetName(); if (an.Name == n.Name || an.FullName == n.FullName) { return(assemblies[i]); } } return(null); }, (a, s, b) => { Type temp = a.GetType(s); if (temp == null) { BuildState = AddinBuildState.LoadTypeFail; } return(temp); }, true); if (type.GetInterface(typeof(IAddin).FullName) == null) { BuildState = AddinBuildState.LoadTypeFail; throw new TypeLoadException($"{type.FullName} must implement IAddin interface"); } AddinAttribute attr = type.GetCustomAttribute <AddinAttribute>(); if (attr == null) { BuildState = AddinBuildState.LoadTypeFail; throw new AddinAttributeException($"{type.FullName} can not find 'AddinAttribute'"); } if (attr.Guid != Owner.Guid) { BuildState = AddinBuildState.LoadTypeFail; throw new AddinAttributeException($"{type.FullName} guid not match"); } _type = type; }
/// <summary> /// 解析插件的依赖列表。 /// </summary> private void AnalysisDependencies() { if (Dependencies == null) { return; } Collection <String> unresoles = new Collection <String>(); String dependency = null; for (Int32 i = 0; i < Dependencies.Length; i++) { dependency = Dependencies[i]; IEnumerable <AddinTreeNode> nodes = AddinManager.Instance.GetNode(dependency); if (nodes == null) { unresoles.Add(dependency); } } if (unresoles.Count != 0) { BuildState = AddinBuildState.DependecyFail; throw new AddinDependencyException(unresoles.ToArray()); } }
/// <summary> /// 解析依赖,加载程序集和类型。 /// </summary> private void Analysis() { AnalysisAssemblies(); BuildDependencies(); BuildState = AddinBuildState.NotBuild; }