72 lines
2.2 KiB
C#
72 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Pilz.Plugins
|
|
{
|
|
public class PluginManager<TPluginInterface, TPluginRuntimeInfo> where TPluginInterface : class where TPluginRuntimeInfo : PluginRuntimeInfo<TPluginInterface>
|
|
{
|
|
public static IEnumerable<TPluginRuntimeInfo> LoadPlugins(string[] paths)
|
|
{
|
|
var states = new List<TPluginRuntimeInfo>();
|
|
|
|
foreach (string path in paths)
|
|
states.Add(LoadPlugin(path));
|
|
|
|
return states;
|
|
}
|
|
|
|
public static TPluginRuntimeInfo LoadPlugin(string path)
|
|
{
|
|
var info = Activator.CreateInstance<TPluginRuntimeInfo>();
|
|
var irmplugin = typeof(TPluginInterface);
|
|
var loadContext = new PluginLoadContext(path);
|
|
Assembly? assembly = null;
|
|
|
|
if (File.Exists(path))
|
|
{
|
|
try
|
|
{
|
|
assembly = loadContext.LoadFromAssemblyName(new AssemblyName(Path.GetFileNameWithoutExtension(path)));
|
|
}
|
|
catch
|
|
{
|
|
info.Status = PluginStatus.ErrorAtLoading;
|
|
}
|
|
}
|
|
else
|
|
info.Status = PluginStatus.FileNotFound;
|
|
|
|
if (assembly != null)
|
|
{
|
|
foreach (var type in assembly.GetTypes())
|
|
{
|
|
if (info.Plugin == null && irmplugin.IsAssignableFrom(type))
|
|
{
|
|
try
|
|
{
|
|
if (Activator.CreateInstance(type) is TPluginInterface plugin)
|
|
{
|
|
info.Plugin = plugin;
|
|
info.Status = PluginStatus.Success;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
info.Status = PluginStatus.ErrorAtInitializing;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (info.Plugin == null)
|
|
info.Status = PluginStatus.NoValidPlugin;
|
|
}
|
|
|
|
return info;
|
|
}
|
|
}
|
|
}
|