ict-architecture
Labo 07: Microkernel Architectuur
Implementatie van een plugin-systeem in C# voor een TextCell spreadsheetapplicatie.
Compileren & Uitvoeren
dotnet buildCompileer de C# applicatie.
dotnet runStart de applicatie op.
Bestanden & Configuraties
IPlugin.cs
csharp
using System.Collections.Generic;public interface IPlugin{ string Name { get; } BerekendeCel Execute(List<BerekendeCel> args);} De interface waaraan alle plugins moeten voldoen.
MinPlugin.cs
csharp
using System;using System.Collections.Generic;public class MinPlugin : IPlugin{ public string Name => "min"; public BerekendeCel Execute(List<BerekendeCel> args) { if (args.Count == 0) return new BerekendeCel("Fout: Geen argumenten", CelType.ERROR); int minWaarde = int.MaxValue; foreach (var arg in args) { if (arg.CelType != CelType.INT) return new BerekendeCel($"Fout: geen getal.", CelType.ERROR); int val = Convert.ToInt32(arg.VoorstellingWaarde); if (val < minWaarde) minWaarde = val; } return new BerekendeCel(minWaarde.ToString(), CelType.INT); }} Een implementatie van de IPlugin interface voor een 'min' functie.
Program.cs (Snippet)
csharp
using System.Reflection;public static List<IPlugin> LoadPlugins(string path){ var plugins = new List<IPlugin>(); if (!Directory.Exists(path)) return plugins; foreach (var file in Directory.GetFiles(path, "*.dll")) { var assembly = Assembly.LoadFrom(file); var types = assembly.GetTypes().Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract); foreach (var type in types) { if (Activator.CreateInstance(type) as IPlugin is IPlugin plugin) plugins.Add(plugin); } } return plugins;} Code om plugins dynamisch in te laden via Reflection.