示例#1
0
        /// <summary>
        /// 从文件中加载插件并管理(但不初始化)
        /// </summary>
        /// <param name="fileName">相对于运行目录的文件名</param>
        public async Task LoadPackageAsync(string fileName)
        {
            using PackageArchiveReader reader = new PackageArchiveReader(File.OpenRead(fileName), false);
            NuspecReader nuspecReader = await reader.GetNuspecReaderAsync(CancellationToken.None);

            string identity = nuspecReader.GetId();
            IEnumerable <FrameworkSpecificGroup> groups = await reader.GetLibItemsAsync(CancellationToken.None);

            FrameworkSpecificGroup group = groups.Where(x => x.TargetFramework.GetShortFolderName().StartsWith("netstandard")).OrderByDescending(x => x.TargetFramework.GetShortFolderName()).FirstOrDefault();

            foreach (string packageFile in group.Items)
            {
                if (!packageFile.EndsWith(".dll"))
                {
                    continue;
                }

                string tmpPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
                string path    = reader.ExtractFile(packageFile, tmpPath, NullLogger.Instance);
                //Type type = Load(await File.ReadAllBytesAsync(path));
                Type type = Load(path);
                if (type != null)// 为null时则不是插件程序集, 但不一定不是依赖程序集
                {
                    PluginContext context = new PluginContext();
                    PluginMeta    meta    = new PluginMeta(identity, fileName, Path.Combine(Environment.CurrentDirectory, "plugins", identity));
                    context.Meta = meta;
                    if (!Directory.Exists(meta.SpaceDirectory))
                    {
                        Directory.CreateDirectory(meta.SpaceDirectory);
                        FrameworkSpecificGroup item = (await reader.GetContentItemsAsync(CancellationToken.None)).FirstOrDefault();
                        if (item != null)
                        {
                            foreach (string file in item.Items)
                            {
                                if (file.EndsWith('/') || file.EndsWith('\\'))
                                {
                                    continue;
                                }

                                ZipArchiveEntry entry = reader.GetEntry(file);
                                entry.SaveAsFile(Path.Combine(meta.SpaceDirectory, file.Substring(8)), NullLogger.Instance);
                            }
                        }
                    }
                    string configFile = Path.Combine(meta.SpaceDirectory, "config.json");
                    if (File.Exists(configFile))
                    {
                        context.Configuration = new Lazy <IConfiguration>(() =>
                        {
                            ConfigurationBuilder builder = new ConfigurationBuilder();
                            builder.AddJsonFile(configFile);
                            return(builder.Build());
                        });
                    }
                    else
                    {
                        context.Configuration = new Lazy <IConfiguration>(() => (new ConfigurationBuilder().Build()));
                    }
                    string dataFile = Path.Combine(meta.SpaceDirectory, "data.db");
                    context.Repository = new Lazy <IRepository>(() => new LiteDbRepository(new LiteDatabase(dataFile)));
                    plugins.Add(type, context);
                }
            }
        }
        /// <summary>
        ///     从文件中加载插件并管理(但不初始化)
        /// </summary>
        /// <param name="fileName">相对于运行目录的文件名</param>
        public async Task LoadPackageAsync(string fileName)
        {
            using var reader = new PackageArchiveReader(File.OpenRead(fileName), false);
            var nuspecReader = await reader.GetNuspecReaderAsync(CancellationToken.None);

            var identity = nuspecReader.GetId();
            var groups   = await reader.GetLibItemsAsync(CancellationToken.None);

            var group = groups.FirstOrDefault();

            foreach (var packageFile in group !.Items)
            {
                if (!packageFile.EndsWith(".dll"))
                {
                    continue;
                }

                var tmpPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
                var path    = reader.ExtractFile(packageFile, tmpPath, NullLogger.Instance);
                //Type type = Load(await File.ReadAllBytesAsync(path));
                var type = Load(path);
                if (type == null)
                {
                    continue;
                }
                var context = new PluginContext();
                var meta    = new PluginMeta(identity, fileName,
                                             Path.Combine(Environment.CurrentDirectory, "plugins", identity));
                context.Meta = meta;
                if (!Directory.Exists(meta.SpaceDirectory))
                {
                    Directory.CreateDirectory(meta.SpaceDirectory);
                    var item = (await reader.GetContentItemsAsync(CancellationToken.None)).FirstOrDefault();
                    if (item != null)
                    {
                        foreach (var file in item.Items)
                        {
                            if (file.EndsWith('/') || file.EndsWith('\\'))
                            {
                                continue;
                            }

                            var entry = reader.GetEntry(file);
                            entry.SaveAsFile(Path.Combine(meta.SpaceDirectory, file.Substring(8)),
                                             NullLogger.Instance);
                        }
                    }
                }

                var configFile = Path.Combine(meta.SpaceDirectory, "config.json");
                if (File.Exists(configFile))
                {
                    context.Configuration = new Lazy <IConfiguration>(() =>
                    {
                        var builder = new ConfigurationBuilder();
                        builder.AddJsonFile(configFile);
                        return(builder.Build());
                    });
                }
                else
                {
                    context.Configuration = new Lazy <IConfiguration>(() => new ConfigurationBuilder().Build());
                }
                var dataFile = Path.Combine(meta.SpaceDirectory, "data.litedb.db");
                context.Repository = new Lazy <IRepository>(() => new LiteDbRepository(new LiteDatabase(dataFile)));
                plugins.Add(type, context);
            }
        }