Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
 private static string GetAssemblyVersion(string assemblyQualifiedName)
 {
     return(AssemblyQualifiedNameParser.TryParse(assemblyQualifiedName, out var result)
         ? result.Version
         : DefaultAssemblyVersion);
 }