recipe name filter

This commit is contained in:
meelstorm
2025-07-28 09:52:29 +02:00
parent 71d59df0cd
commit f80b275ad8
58 changed files with 4066 additions and 79 deletions

View File

@@ -0,0 +1,10 @@
using Ninject;
using Ninject.Extensions.ChildKernel;
namespace VisionBuilder.UI.Common.Plugins;
public interface IPlugin
{
public void RegisterGlobalModules(IKernel kernel);
public void RegisterCameraModules(IKernel kernel, string cameraName);
}

View File

@@ -0,0 +1,37 @@
using System.Reflection;
using System.Runtime.Loader;
namespace VisionBuilder.UI.Common.Plugins;
class PluginLoadContext : AssemblyLoadContext
{
private AssemblyDependencyResolver _resolver;
public PluginLoadContext(string pluginPath)
{
_resolver = new AssemblyDependencyResolver(pluginPath);
}
protected override Assembly Load(AssemblyName assemblyName)
{
string assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
{
return LoadFromAssemblyPath(assemblyPath);
}
return null;
}
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
{
string libraryPath = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
if (libraryPath != null)
{
return LoadUnmanagedDllFromPath(libraryPath);
}
return IntPtr.Zero;
}
}

View File

@@ -0,0 +1,67 @@
using System.Reflection;
using Inspectron.Settings;
using Ninject;
using Serilog;
namespace VisionBuilder.UI.Common.Plugins;
public class PluginLoader
{
private static PluginLoader _instance;
public static PluginLoader Instance => _instance ??= new PluginLoader();
const string PLUGINS_DIRECTORY = "Plugins";
private PluginLoader()
{
Initialize();
}
public List<IPlugin> Plugins { get; } = new List<IPlugin>();
public void Initialize()
{
Log.Information("Loading plugins...");
var pluginsPath = Path.Combine("..", "Data", PLUGINS_DIRECTORY);
Directory.CreateDirectory(pluginsPath);
var pluginFolders = Directory.GetDirectories(pluginsPath);
foreach (string folder in pluginFolders)
{
var assemblyPath = Path.Combine(folder, Path.GetFileNameWithoutExtension(folder) + ".dll");
if (!File.Exists(assemblyPath))
{
Log.Warning("Plugin assembly not found: {AssemblyPath}", assemblyPath);
continue;
}
try
{
LoadPluginAssembly(assemblyPath);
}
catch (Exception ex)
{
Log.Error(ex, "Failed to load plugin from {AssemblyPath}", assemblyPath);
}
}
Log.Information("Plugin loading completed.");
}
private void LoadPluginAssembly(string assemblyPath)
{
var absPath = Path.GetFullPath(assemblyPath);
var loadContext = new PluginLoadContext(absPath);
var assembly = loadContext.LoadFromAssemblyPath(absPath);
Log.Information("Loaded plugin assembly: {AssemblyName}", assembly.GetName().Name);
foreach (var type in assembly.GetTypes())
{
if (type.IsAssignableTo(typeof(IPlugin)) && !type.IsAbstract)
{
Plugins.Add((IPlugin)Activator.CreateInstance(type));
Log.Information("Discovered plugin: {PluginName}", type.Name);
}
}
}
}