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