Exil Productions 9d9b631938 Fixed Sample Project
2025-09-08 22:51:11 +02:00
2025-09-08 22:20:20 +02:00
2025-09-08 22:20:20 +02:00
2025-09-08 22:51:11 +02:00
2025-09-08 22:20:20 +02:00
2025-09-08 22:26:40 +02:00

AddonLib

AddonLib

Overview

  • AddonLib is a .NET 8 library for building addon-enabled applications in C#.
  • It lets app developers expose a host API to addons and raise callbacks; addon developers implement addons that react to callbacks and call back into the host.

Projects

  • AddonLib: core library containing attributes, base classes, and AddonManager.
  • HostApp: example host application that integrates AddonLib and auto-loads plugins from a Plugins folder.
  • SampleAddon: example addon implementing AddonBase and reacting to host callbacks.

Key concepts

  • Assembly-level addon metadata: [assembly: Addon(name, author, version)]
  • Addon base class: inherit from AddonBase to access Context, Services, and host helper methods.
  • Callbacks: mark methods with [AddonCallback("EventName")] (or omit the name to use the method name). The host raises these events so addons receive notifications.
  • Host API exposure:
    • Methods: mark host methods with [AddonCallable("Name?")] so addons can call them via CallHost.
    • Fields/Properties: mark with [AddonAccessible(ReadOnly|ReadWrite, "Name?")] so addons can GetHostValue/SetHostValue.

Auto plugin loading

  • AddonManager can auto-create a Plugins directory and auto-load all addon DLLs from it at startup.
  • Default directory is AppContext.BaseDirectory/Plugins (configurable via constructor).

Host quick start

  1. Create and configure the manager in your app entry point:
    • var manager = new AddonManager("Plugins", autoInitialize: true);
  2. Register an API object with attributes for addons to call and access:
    • manager.RegisterHostApi(new HostApi(manager));
  3. Raise callbacks from host code so addons can react:
    • Mark a host method with [AddonCallback] and inside it call manager.RaiseAddonCallback() (uses the caller method name as event), or
    • Call manager.RaiseCallback(MethodBase.GetCurrentMethod(), args...) to use an explicit [AddonCallback("EventName")] annotation.

Addon quick start

  1. Mark the assembly with metadata:
    • [assembly: Addon("My Addon", "Me", "1.0.0")]
  2. Create a class inheriting AddonBase:
    • public sealed class MyAddon : AddonBase { ... }
  3. Add callback methods annotated with [AddonCallback]:
    • [AddonCallback] void OnTick(AddonContext ctx) { var message = CallHost("Echo", "Hi"); }
  4. Optional: use GetHostValue/SetHostValue for members marked [AddonAccessible].
  5. Build the addon and drop the resulting DLL into the host Plugins folder.

Examples in this repository

  • HostApp demonstrates:
    • Initializing AddonManager with auto-initialization and autoload.
    • Registering a HostApi with [AddonCallable], [AddonAccessible], and [AddonCallback].
    • Raising callbacks using manager.RaiseAddonCallback().
  • SampleAddon demonstrates:
    • Declaring addon metadata.
    • Subscribing to the host OnTick event with [AddonCallback] and using CallHost/GetHostValue/SetHostValue.

Attributes reference (summary)

  • AddonAttribute (assembly): Addon(name, author, version)
  • AddonCallbackAttribute (method): optional EventName; if omitted, method name is used. AllowMultiple = true to bind one method to multiple events.
  • AddonCallableAttribute (method): optional Name; if omitted, method name is used. Host methods callable by addons.
  • AddonAccessibleAttribute (field/property): access mode ReadOnly or ReadWrite and optional Name; if omitted, member name is used.

AddonBase essentials

  • Context: Addon metadata and assembly.
  • Services: optional IServiceProvider provided by the host.
  • CallHost(name, params object?[] args)
  • GetHostValue(name)
  • SetHostValue(name, value)
  • Lifecycle: OnLoaded(), OnUnloading()

AddonManager essentials

  • Constructors:
    • AddonManager() no auto init
    • AddonManager(string? pluginsDirectory, bool autoInitialize = true, IServiceProvider? services = null)
  • Properties: PluginsDirectory, LoadedAddons
  • API exposure: RegisterHostApi(object host)
  • Loading:
    • InitializePluginsDirectory(createIfMissing = true)
    • LoadAllFromPluginsDirectory(SearchOption.TopDirectoryOnly)
    • LoadFrom(string assemblyPath)
    • LoadFrom(Assembly assembly)
  • Callbacks:
    • RaiseCallback(string eventName, params object?[] args)
    • RaiseCallback(MethodBase method, params object?[] args)
    • Extensions: manager.RaiseAddonCallback() (uses caller member name), manager.RaiseAddonCallbackFrom(MethodBase, ...)

Common convenience behaviors

  • [AddonCallback] without a name uses the method name as the event name.
  • Callback parameter injection supports AddonContext, IServiceProvider (when compatible), and AddonManager automatically.
  • RegisterHostApi also scans static methods/fields/properties for attributes on the provided type for convenience.

Build and run (example)

  • Build SampleAddon
  • Copy SampleAddon/bin/Debug/net8.0/SampleAddon.dll to HostApp/Plugins
  • Build and run HostApp
  • Press T to raise the OnTick event; see SampleAddon reacting in the console.

Notes

  • Only assemblies that include [assembly: Addon(...)] and contain a non-abstract AddonBase implementation are loaded as addons.
  • Non-addon DLLs in the Plugins directory are ignored.
Description
No description provided
Readme 41 KiB
Languages
C# 100%