private void ExecuteInMemoryAssembly(HostedPlugin plugin, string input) { var context = new CollectibleAssemblyContext(); using (var ms = new MemoryStream()) { var compilation = CSharpCompilation.Create(plugin.Name, new[] { CSharpSyntaxTree.ParseText(plugin.Code) }, new[] { MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location), MetadataReference.CreateFromFile(typeof(Console).GetTypeInfo().Assembly.Location), MetadataReference.CreateFromFile(SystemRuntime.Location), }, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var cr = compilation.Emit(ms); ms.Seek(0, SeekOrigin.Begin); var assembly = context.LoadFromStream(ms); var type = assembly.GetType("Plugin"); var executeMethod = type.GetMethod("Execute"); var instance = Activator.CreateInstance(type); var dic = PluginResponses.GetOrCreate(plugin.Name); dic.Add(executeMethod.Invoke(instance, new object[] { input }).ToString()); } context.Unload(); }
public void RunPlugin(HostedPlugin plugin, string input) { if (plugin.InMemory) { RunDynamicPlugin(plugin, input); } else { ExecuteAssembly(plugin, input); } RunGarbageCollection(); }
public void CreateOrRunDynamicPlugin(string syntax, string input) { //if hosted assembly, just execute, else create var name = $"DynamicPlugin{input}"; var plugin = Plugins.FirstOrDefault(f => f.Name == name); if (plugin == null) { plugin = new HostedPlugin(); plugin.Name = name; plugin.Code = syntax; } Plugins.Add(plugin); ExecuteInMemoryAssembly(plugin, input); RunGarbageCollection(); }
private void ExecuteAssembly(HostedPlugin plugin, string input) { var context = new CollectibleAssemblyContext(); var assemblyPath = Path.Combine(plugin.FilePath); using (var fs = new FileStream(assemblyPath, FileMode.Open, FileAccess.Read)) { var assembly = context.LoadFromStream(fs); var type = assembly.GetType("PluginSystem.Plugin"); var executeMethod = type.GetMethod("Execute"); var instance = Activator.CreateInstance(type); var dic = PluginResponses.GetOrCreate(plugin.Name); dic.Add(executeMethod.Invoke(instance, new object[] { input }).ToString()); } context.Unload(); }
public void RunDynamicPlugin(HostedPlugin plugin, string input) { ExecuteInMemoryAssembly(plugin, input); RunGarbageCollection(); }
public void RunPlugin(HostedPlugin plugin, string input) { ExecuteAssembly(plugin, input); RunGarbageCollection(); }