Exemplo n.º 1
0
        public async Task <ICollection <Assembly> > RegisterPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            m_PluginAssembliesSources.Add(source);
            var assemblies = await m_PluginAssemblyStore.LoadPluginAssembliesAsync(source);

            foreach (var assembly in assemblies)
            {
                // PluginAssemblyStore checks if this attribute exists
                var pluginMetadata  = assembly.GetCustomAttribute <PluginMetadataAttribute>();
                var pluginDirectory = PluginHelper.GetWorkingDirectory(m_Runtime, pluginMetadata.Id);

                if (!Directory.Exists(pluginDirectory))
                {
                    Directory.CreateDirectory(pluginDirectory);
                }

                AssemblyHelper.CopyAssemblyResources(assembly, Path.Combine(m_Runtime.WorkingDirectory, "plugins", pluginMetadata.Id));
            }

            foreach (var assembly in assemblies)
            {
                // Auto register services with [Service] and [ServiceImplementation] attributes
                RegisterServicesFromAssembly(assembly);
            }

            m_Assemblies.AddRange(assemblies);
            return(assemblies);
        }
Exemplo n.º 2
0
        public async Task <ICollection <Assembly> > LoadPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            var providerAssemblies = await source.LoadPluginAssembliesAsync();

            foreach (var providerAssembly in providerAssemblies.ToList())
            {
                var pluginMetadata = providerAssembly.GetCustomAttribute <PluginMetadataAttribute>();
                if (pluginMetadata == null)
                {
                    m_Logger.LogWarning($"No plugin metadata attribute found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                    providerAssemblies.Remove(providerAssembly);
                    continue;
                }

                if (!providerAssembly.FindTypes <IOpenModPlugin>(false).Any())
                {
                    m_Logger.LogWarning($"No {nameof(IOpenModPlugin)} implementation found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                    providerAssemblies.Remove(providerAssembly);
                    continue;
                }
            }

            m_LoadedPluginAssemblies.AddRange(providerAssemblies.Select(d => new WeakReference(d)));
            return(providerAssemblies);
        }
Exemplo n.º 3
0
        public async Task <ICollection <Assembly> > LoadPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            var providerAssemblies = await source.LoadPluginAssembliesAsync();

            foreach (var providerAssembly in providerAssemblies.ToList())
            {
                var pluginMetadata = providerAssembly.GetCustomAttribute <PluginMetadataAttribute>();
                if (pluginMetadata == null)
                {
                    m_Logger.LogWarning($"No plugin metadata attribute found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                    providerAssemblies.Remove(providerAssembly);
                    continue;
                }

                ICollection <Type> types;
                try
                {
                    types = providerAssembly.GetTypes();
                }
                catch (ReflectionTypeLoadException ex)
                {
                    m_Logger.LogTrace(ex, $"Failed to load some types from plugin \"{pluginMetadata.Id}\"");
                    if (ex.LoaderExceptions != null && ex.LoaderExceptions.Length > 0)
                    {
                        foreach (var loaderException in ex.LoaderExceptions)
                        {
                            m_Logger.LogTrace(loaderException, "Loader Exception: ");
                        }
                    }

                    types = ex.Types.Where(d => d != null).ToArray();
                }

                if (!types.Any(d => typeof(IOpenModPlugin).IsAssignableFrom(d) && !d.IsAbstract && d.IsClass))
                {
                    m_Logger.LogWarning($"No {nameof(IOpenModPlugin)} implementation found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                    providerAssemblies.Remove(providerAssembly);
                    continue;
                }
            }

            m_LoadedPluginAssemblies.AddRange(providerAssemblies.Select(d => new WeakReference(d)));
            return(providerAssemblies);
        }
Exemplo n.º 4
0
        public async Task <ICollection <Assembly> > RegisterPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            m_PluginAssembliesSources.Add(source);
            var assemblies = await m_PluginAssemblyStore.LoadPluginAssembliesAsync(source);

            foreach (var assembly in assemblies)
            {
                // PluginAssemblyStore checks if this attribute exists
                try
                {
                    var pluginMetadata = assembly.GetCustomAttribute <PluginMetadataAttribute>();
                    AssemblyHelper.CopyAssemblyResources(assembly,
                                                         Path.Combine(m_Runtime.WorkingDirectory, "plugins", pluginMetadata.Id));
                }
                catch (Exception ex)
                {
                    m_Logger.LogError(ex, $"Failed to copy resources from assembly: {assembly}");
                }
            }

            foreach (var assembly in assemblies)
            {
                // Auto register services with [Service] and [ServiceImplementation] attributes
                try
                {
                    RegisterServicesFromAssembly(assembly);
                }
                catch (Exception ex)
                {
                    m_Logger.LogError(ex, $"Failed to load services from assembly: {assembly}");
                }
            }

            m_Assemblies.AddRange(assemblies);
            return(assemblies);
        }
Exemplo n.º 5
0
        public async Task <ICollection <Assembly> > LoadPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            var providerAssemblies = await source.LoadPluginAssembliesAsync();

            var assembliesWithMissingDependencies = new List <Assembly>();

            foreach (var providerAssembly in providerAssemblies.ToList())
            {
                var pluginMetadata = providerAssembly.GetCustomAttribute <PluginMetadataAttribute>();
                if (pluginMetadata == null)
                {
                    m_Logger.LogWarning($"No plugin metadata attribute found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                    providerAssemblies.Remove(providerAssembly);
                    continue;
                }

                ICollection <Type> types;
                try
                {
                    types = providerAssembly.GetTypes();
                }
                catch (ReflectionTypeLoadException ex)
                {
                    //Remove Assembly from loading because required dependencies are missing.
                    providerAssemblies.Remove(providerAssembly);

                    var missingAssemblies          = CheckRequiredDependencies(ex.LoaderExceptions);
                    var installMissingDependencies = Configuration != null &&
                                                     Configuration.GetSection("nuget:tryAutoInstallMissingDependencies")
                                                     .Get <bool>();   //todo fix Configuration always null

                    if (!installMissingDependencies)
                    {
                        m_Logger.LogWarning($"Couldn't load plugin from {providerAssembly}: Failed to resolve required dependencies: {string.Join(", ", missingAssemblies.Keys)}", Color.DarkRed);
                        continue;
                    }

                    var installWithSuccess = await TryInstallRequiredDependenciesAsync(providerAssembly, missingAssemblies);

                    if (installWithSuccess)
                    {
                        assembliesWithMissingDependencies.Add(providerAssembly);
                    }

                    continue;
                }

                if (types.Any(d => typeof(IOpenModPlugin).IsAssignableFrom(d) && !d.IsAbstract && d.IsClass))
                {
                    continue;
                }

                m_Logger.LogWarning($"No {nameof(IOpenModPlugin)} implementation found in assembly: {providerAssembly}; skipping loading of this assembly as plugin");
                providerAssemblies.Remove(providerAssembly);
            }

            //Lovely mono :(

            /*if (assembliesWithMissingDependencies.Count != 0)
             * {
             *  m_Logger.LogWarning($"Some plugins can not load until server restart: {string.Join(", ", assembliesWithMissingDependencies)}", Color.DarkRed);
             * }*/

            m_LoadedPluginAssemblies.AddRange(providerAssemblies.Select(d => new WeakReference(d)));
            return(providerAssemblies);
        }
Exemplo n.º 6
0
        public async Task <ICollection <Assembly> > RegisterPluginAssembliesAsync(IPluginAssembliesSource source)
        {
            m_PluginAssembliesSources.Add(source);
            var assemblies = await m_PluginAssemblyStore.LoadPluginAssembliesAsync(source);

            foreach (var assembly in assemblies)
            {
                // PluginAssemblyStore checks if this attribute exists
                try
                {
                    var pluginMetadata = assembly.GetCustomAttribute <PluginMetadataAttribute>();
                    AssemblyHelper.CopyAssemblyResources(assembly,
                                                         Path.Combine(m_Runtime.WorkingDirectory, "plugins", pluginMetadata.Id));
                }
                catch (Exception ex)
                {
                    m_Logger.LogError(ex, $"Failed to copy resources from assembly: {assembly}");
                }
            }

            var deserializer = new DeserializerBuilder()
                               .WithNamingConvention(CamelCaseNamingConvention.Instance)
                               .Build();

            foreach (var assembly in assemblies)
            {
                // Install packages specified in packages.yaml
                try
                {
                    var packagesResourceName = assembly.GetManifestResourceNames()
                                               .FirstOrDefault(x => x.EndsWith("packages.yaml"));
                    if (packagesResourceName == null)
                    {
                        continue;
                    }

                    using var stream = assembly.GetManifestResourceStream(packagesResourceName);
                    if (stream == null)
                    {
                        continue;
                    }

                    using var reader = new StreamReader(stream);
                    var packagesContent = await reader.ReadToEndAsync();

                    var deserialized = deserializer.Deserialize <SerializedPackagesFile>(packagesContent).Packages;

                    var packages = deserialized?.Select(d => new PackageIdentity(d.Id,
                                                                                 d.Version.Equals("latest", StringComparison.OrdinalIgnoreCase)
                            ? null
                            : new NuGetVersion(d.Version)))
                                   .ToList();

                    if (packages == null || packages.Count == 0)
                    {
                        continue;
                    }

                    m_Logger.LogInformation($"Found and installing embedded NuGet packages for plugin assembly: {assembly.GetName().Name}");

                    await m_NuGetPackageManager.InstallPackagesAsync(packages);
                }
                catch (Exception ex)
                {
                    m_Logger.LogError(ex, $"Failed to check/load embedded NuGet packages for assembly: {assembly}");
                }
            }

            foreach (var assembly in assemblies)
            {
                // Auto register services with [Service] and [ServiceImplementation] attributes
                try
                {
                    RegisterServicesFromAssembly(assembly);
                }
                catch (Exception ex)
                {
                    m_Logger.LogError(ex, $"Failed to load services from assembly: {assembly}");
                }
            }

            m_Assemblies.AddRange(assemblies);
            return(assemblies);
        }