コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <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());
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
 /// <summary>
 /// 销毁插件实例。
 /// </summary>
 public void Destroy()
 {
     if (BuildState == AddinBuildState.Build)
     {
         RemoveDependencies();
         AddinDescriptors.Remove(Addin);
         Addin.Dispose();
         Addin      = null;
         BuildState = AddinBuildState.NotBuild;
     }
 }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
        /// <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());
            }
        }
コード例 #7
0
 /// <summary>
 /// 解析依赖,加载程序集和类型。
 /// </summary>
 private void Analysis()
 {
     AnalysisAssemblies();
     BuildDependencies();
     BuildState = AddinBuildState.NotBuild;
 }