public System.IO.Stream GetManifestResourceStream(IResourceUrl resourceUrl)
 {
     using (var wacth = new CodeWatch("GetManifestResourceStream", 1000, new Action <string, LoggerStrategyBase, int?, long>((tag, currentLog, wcount, execms) => currentLog.LogFormat(LoggerLevels.Warn, "\t{0}:资源({3})请求时间为({1})ms.已超过阀值({2})ms.", tag, execms, wcount, resourceUrl.ManifestResourceName))))
     {
         if (!PlusAssemblysList.Any(p => p.Assembly.FullName == resourceUrl.AssemblyFullName))
         {
             throw new Exception("此插件已移除或者不存在。");
         }
         var ass = PlusAssemblysList.First(p => p.Assembly.FullName == resourceUrl.AssemblyFullName);
         return(ass.Assembly.GetManifestResourceStream(resourceUrl.ManifestResourceName));
     }
 }
Пример #2
0
        /// <summary>
        /// 加载应用程序集
        /// </summary>
        /// <param name="folder"></param>
        public override void LoadAssemblies()
        {
            if (PlusAssemblysList == null)
            {
                PlusAssemblysList = new List <IPlusInfo>();
            }
            else
            {
                PlusAssemblysList.Clear();
            }

            #region 插件文件目录
            var plusFilesDirectoryInfo = new DirectoryInfo(SitePaths.PlusFilesDirPath);
            #endregion
            //插件前缀必须为Magicodes
            var plusDlls = plusFilesDirectoryInfo.GetFiles("*.dll", SearchOption.AllDirectories).ToList();
            if (plusDlls.Count == 0)
            {
                return;
            }
            //插件程序集
            //必须是Magicodes插件才会执行插件部署
            //dll名称必须与插件目录名称一致才能部署
            //{PlusDir}/{dllName}
            //{PlusDir}/bin/{dllName}
            var magicodesPlusDlls = plusDlls.Where(p => p.Name.StartsWith("Magicodes.") && (p.Directory.Name + ".dll" == p.Name || p.Directory.Parent.Name + ".dll" == p.Name));
            //依赖的程序集
            var orthersDlls = plusDlls.Where(p => !p.Name.StartsWith("Magicodes.")).Distinct();
            #region 设置程序域
            //var setup = new AppDomainSetup
            //{
            //    ApplicationName = "Magicodes.Core",
            //    //DynamicBase = SitePaths.PlusShadowCopyDirPath,
            //    PrivateBinPath = SitePaths.PlusShadowCopyDirPath,
            //    DisallowCodeDownload = true,
            //    ShadowCopyFiles = "true",
            //    CachePath = SitePaths.PlusCacheDirPath,
            //    ShadowCopyDirectories = SitePaths.PlusShadowCopyDirPath,
            //    //PrivateBinPath = SitePaths.PlusShadowCopyDirPath
            //};
            //var appDomain = AppDomain.CreateDomain("Magicodes.Core.Domain", null, setup);
            CurrentAppDomain = AppDomain.CurrentDomain;
            if (!CurrentAppDomain.IsFullyTrusted)
            {
                throw new MagicodesException("请将当前应用程序信任级别设置为完全信任。");
            }

            #endregion
            var binDir = new DirectoryInfo(SitePaths.SiteRootBinDirPath);

            #region 部署依赖程序集
            foreach (var plus in orthersDlls)
            {
                //如果网站bin目录不存在此dll,则将该dll复制到动态程序集目录
                if (binDir.GetFiles(plus.Name).Length == 0 && PlusManager.DynamicDirectory.GetFiles(plus.Name).Length == 0)
                {
                    PlusManager.CopyToDynamicDirectory(plus);
                    Assembly assembly = Assembly.LoadFrom(plus.FullName);

                    //将程序集添加到当前应用程序域
                    BuildManager.AddReferencedAssembly(assembly);
                }
            }
            #endregion
            #region 部署插件程序集
            foreach (var plus in magicodesPlusDlls)
            {
                PlusManager.Deploy(plus);
            }
            #endregion

            //foreach (var plus in plusDlls)
            //{
            //    //必须是Magicodes插件才会执行插件部署
            //    //dll名称必须与插件目录名称一致才能部署
            //    //{PlusDir}/{dllName}
            //    //{PlusDir}/bin/{dllName}
            //    if (plus.Name.StartsWith("Magicodes.") && (plus.Directory.Name + ".dll" == plus.Name || plus.Directory.Parent.Name + ".dll" == plus.Name))
            //        PlusManager.Deploy(plus);
            //    //如果网站bin目录不存在此dll,则将该dll复制到动态程序集目录
            //    else if (binDir.GetFiles(plus.Name).Length == 0 && PlusManager.DynamicDirectory.GetFiles(plus.Name).Length == 0)
            //    {
            //        PlusManager.CopyToDynamicDirectory(plus);
            //        Assembly assembly = Assembly.LoadFrom(plus.FullName);

            //        //将程序集添加到当前应用程序域
            //        BuildManager.AddReferencedAssembly(assembly);
            //    }
            //}
        }
Пример #3
0
        /// <summary>
        /// 加载应用程序集
        /// </summary>
        /// <param name="folder"></param>
        public override void LoadAssemblies()
        {
            if (PlusAssemblysList == null)
            {
                PlusAssemblysList = new List <IPlusInfo>();
            }
            else
            {
                PlusAssemblysList.Clear();
            }

            #region 插件文件目录
            var plusFilesDirectoryInfo = new DirectoryInfo(SitePaths.PlusFilesDirPath);
            #endregion
            //插件前缀必须为Magicodes
            var plusDlls = plusFilesDirectoryInfo.GetFiles("*.dll", SearchOption.AllDirectories).ToList();
            if (plusDlls.Count == 0)
            {
                return;
            }
            //插件程序集
            //必须是Magicodes插件才会执行插件部署
            //dll名称必须与插件目录名称一致才能部署
            //{PlusDir}/{dllName}
            //{PlusDir}/bin/{dllName}
            var magicodesPlusDlls = plusDlls.Where(p => p.Name.StartsWith("Magicodes.") && (p.Directory.Name + ".dll" == p.Name || p.Directory.Parent.Name + ".dll" == p.Name));
            //依赖的程序集
            var orthersDlls = plusDlls.Where(p => !p.Name.StartsWith("Magicodes.")).Distinct();
            #region 设置程序域
            //var setup = new AppDomainSetup
            //{
            //    ApplicationName = "Magicodes.Core",
            //    //DynamicBase = SitePaths.PlusShadowCopyDirPath,
            //    PrivateBinPath = SitePaths.PlusShadowCopyDirPath,
            //    DisallowCodeDownload = true,
            //    ShadowCopyFiles = "true",
            //    CachePath = SitePaths.PlusCacheDirPath,
            //    ShadowCopyDirectories = SitePaths.PlusShadowCopyDirPath,
            //    //PrivateBinPath = SitePaths.PlusShadowCopyDirPath
            //};
            //var appDomain = AppDomain.CreateDomain("Magicodes.Core.Domain", null, setup);
            CurrentAppDomain = AppDomain.CurrentDomain;
            if (!CurrentAppDomain.IsFullyTrusted)
            {
                throw new MagicodesException("请将当前应用程序信任级别设置为完全信任");
            }

            #endregion
            var binDir = new DirectoryInfo(SitePaths.SiteRootBinDirPath);

            #region 部署依赖程序集
            foreach (var plus in orthersDlls)
            {
                //如果网站bin目录不存在此dll,则将该dll复制到动态程序集目录
                if (binDir.GetFiles(plus.Name).Length == 0 && PlusManager.DynamicDirectory.GetFiles(plus.Name).Length == 0)
                {
                    PlusManager.CopyToDynamicDirectory(plus);
                    Assembly assembly   = Assembly.LoadFrom(plus.FullName);
                    var      assemblies = AppDomain.CurrentDomain.GetAssemblies();
                    if (!assemblies.Any(p => p.FullName == assembly.FullName))
                    {
                        //将程序集添加到当前应用程序域
                        BuildManager.AddReferencedAssembly(assembly);
                    }
                }
            }
            #endregion
            #region 部署插件程序集
            foreach (var plus in magicodesPlusDlls)
            {
                PlusManager.Deploy(plus);
            }
            #endregion
            #region 添加插件菜单
            var r = APIContext <string> .Current.SiteAdminNavigationRepository;
            if (r == null)
            {
                return;
            }
            foreach (var plusInfo in PlusManager.PluginsList)
            {
                if (plusInfo.PlusConfigInfo != null && plusInfo.PlusConfigInfo.PlusMenus != null && plusInfo.PlusConfigInfo.PlusMenus.Length > 0)
                {
                    if (r.GetQueryable().Any(p => p.PlusId == plusInfo.Id))
                    {
                        r.RemoveRange(r.GetQueryable().Where(p => p.PlusId == plusInfo.Id));
                        r.SaveChanges();
                    }
                    foreach (var plusMenu in plusInfo.PlusConfigInfo.PlusMenus)
                    {
                        AddPlusMenu(plusInfo, r, plusMenu, null);
                    }
                    r.SaveChanges();
                }
            }
            #endregion
        }
 public System.Reflection.Assembly GetAssemblyByResourceUrl(IResourceUrl resourceUrl)
 {
     return(PlusAssemblysList.First(p => p.Assembly.FullName == resourceUrl.AssemblyFullName).Assembly);
 }