private LoadedPlugin LoadPluginFromZip(string path) { var archive = LoadPluginArchive(path); var manifestEntry = archive.GetEntry(PluginManifest.EntryName); if (manifestEntry == null) { throw new ExpectedException($"'{path}' is not valid *.plugin bundle. No {PluginManifest.EntryName} found."); } var manifest = LoadManifest(manifestEntry); var assemblyName = $"{AssemblyQualifiedNameParser.Parse(manifest.AssemblyQualifiedTypeName).AssemblyName}.dll"; var mainAssemblyEntry = archive .Entries .FirstOrDefault(e => e.Name.Equals(assemblyName, StringComparison.InvariantCultureIgnoreCase)); if (mainAssemblyEntry == null) { throw new ExpectedException($"Can't find '{assemblyName}' inside '{path}'"); } var assemblyBytes = LoadAssemblyBytes(mainAssemblyEntry); var assembly = LoadAssemblyFromBytes(assemblyBytes, message => Log.Error($"Can't load '{assemblyName}' from '{path}': {message}")); if (assembly == null) { throw new ExpectedException($"Can't load plugin assembly from '{path}'."); } LogVerbose($"Loaded '{assemblyName}' from '{path}'"); var archiveContext = new ArchiveContext(path, archive, assembly); try { PluginArchives.Add(archiveContext); var plugins = FindAllPluginImplementations(assembly).ToList(); return(new LoadedPlugin(GetSinglePluginOrThrow(path, plugins), manifest, path)); } catch (Exception) { PluginArchives.Remove(archiveContext); throw; } }
private static string GetAssemblyVersion(string assemblyQualifiedName) { return(AssemblyQualifiedNameParser.TryParse(assemblyQualifiedName, out var result) ? result.Version : DefaultAssemblyVersion); }