diff --git a/Framework/Core/PluginManager.cs b/Framework/Core/PluginManager.cs index 69ee4bb..7de080f 100644 --- a/Framework/Core/PluginManager.cs +++ b/Framework/Core/PluginManager.cs @@ -59,20 +59,4 @@ } } } - - public interface IProjectPlugin - { - void Announce(); - void Decommission(); - } - - public interface IHasLogPrefix - { - string LogPrefix { get; } - } - - public interface IHasMetadata - { - void AddMetadata(IAddMetadata metadata); - } } diff --git a/Framework/Core/ProjectPlugin.cs b/Framework/Core/ProjectPlugin.cs new file mode 100644 index 0000000..72f3c16 --- /dev/null +++ b/Framework/Core/ProjectPlugin.cs @@ -0,0 +1,34 @@ +using Utils; + +namespace Core +{ + public interface IProjectPlugin + { + void Announce(); + void Decommission(); + } + + public interface IHasLogPrefix + { + string LogPrefix { get; } + } + + public interface IHasMetadata + { + void AddMetadata(IAddMetadata metadata); + } + + public static class ProjectPlugin + { + /// + /// On some platforms and in some cases, not all required plugin assemblies are automatically loaded into the app domain. + /// In this case, the runtime needs a slight push to load it before the EntryPoint class is instantiated. + /// Used ProjectPlugin.Load<>() before you create an EntryPoint to ensure all plugins you want to use are loaded. + /// + public static void Load() where T : IProjectPlugin + { + var type = typeof(T); + FrameworkAssert.That(type != null, $"Unable to load plugin."); + } + } +} diff --git a/Tests/CodexContinuousTests/EntryPointFactory.cs b/Tests/CodexContinuousTests/EntryPointFactory.cs index f61d22e..90b92b4 100644 --- a/Tests/CodexContinuousTests/EntryPointFactory.cs +++ b/Tests/CodexContinuousTests/EntryPointFactory.cs @@ -5,6 +5,14 @@ namespace ContinuousTests { public class EntryPointFactory { + public EntryPointFactory() + { + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); + } + public EntryPoint CreateEntryPoint(string kubeConfigFile, string dataFilePath, string customNamespace, ILog log) { var kubeConfig = GetKubeConfig(kubeConfigFile); diff --git a/Tests/CodexTests/CodexDistTest.cs b/Tests/CodexTests/CodexDistTest.cs index 2af737d..32c6ec2 100644 --- a/Tests/CodexTests/CodexDistTest.cs +++ b/Tests/CodexTests/CodexDistTest.cs @@ -1,10 +1,10 @@ using CodexContractsPlugin; using CodexPlugin; +using Core; using DistTestCore; using DistTestCore.Helpers; using GethPlugin; using NUnit.Framework.Constraints; -using Utils; namespace Tests { @@ -12,6 +12,14 @@ namespace Tests { private readonly List onlineCodexNodes = new List(); + public CodexDistTest() + { + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); + } + public ICodexNode AddCodex() { return AddCodex(s => { }); diff --git a/Tools/CodexNetDeployer/Deployer.cs b/Tools/CodexNetDeployer/Deployer.cs index ee9ff9a..f06e91c 100644 --- a/Tools/CodexNetDeployer/Deployer.cs +++ b/Tools/CodexNetDeployer/Deployer.cs @@ -18,7 +18,11 @@ namespace CodexNetDeployer { this.config = config; peerConnectivityChecker = new PeerConnectivityChecker(); - + + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); + ProjectPlugin.Load(); entryPoint = CreateEntryPoint(new NullLog()); } @@ -27,8 +31,6 @@ namespace CodexNetDeployer var ep = CreateEntryPoint(new ConsoleLog()); Log("Using plugins:" + Environment.NewLine); - ep.Announce(); - Log(""); var metadata = ep.GetPluginMetadata(); foreach (var entry in metadata) {