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