private async Task LoadFromAssembly( FileInfo assemblyFile, IKernel kernel, KernelInvocationContext context) { if (assemblyFile == null) { throw new ArgumentNullException(nameof(assemblyFile)); } if (kernel == null) { throw new ArgumentNullException(nameof(kernel)); } if (!assemblyFile.Exists) { throw new ArgumentException($"File {assemblyFile.FullName} doesn't exist", nameof(assemblyFile)); } bool loadExtensions; lock (AssemblyLoadLock) { loadExtensions = LoadedAssemblies.Add(AssemblyName.GetAssemblyName(assemblyFile.FullName)); } if (loadExtensions) { var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyFile.FullName); var extensionTypes = assembly .ExportedTypes .Where(t => t.CanBeInstantiated() && typeof(IKernelExtension).IsAssignableFrom(t)) .ToArray(); foreach (var extensionType in extensionTypes) { var extension = (IKernelExtension)Activator.CreateInstance(extensionType); var display = Guid.NewGuid().ToString("N"); context.Publish(new DisplayedValueProduced( $"Loading kernel extension {extensionType.Name} from assembly {assemblyFile.FullName}", context.Command, valueId: display)); try { await extension.OnLoadAsync(kernel); context.Publish(new DisplayedValueUpdated( $"Loaded kernel extension {extensionType.Name} from assembly {assemblyFile.FullName}", display, context.Command)); } catch (Exception e) { context.Publish(new ErrorProduced( $"Failure loading kernel extension {extensionType.Name} from assembly {assemblyFile.FullName}", context.Command)); context.Fail(new KernelExtensionLoadException(e)); } } } }
internal async Task SendAsync( IKernelCommand command, KernelInvocationContext context) { EnsureMiddlewarePipelineIsInitialized(); try { await _pipeline(command, context, (_, __) => Task.CompletedTask); } catch (Exception exception) { context.Fail(exception); } }
public async Task HandleAsync(SubmitCode command, KernelInvocationContext context) { if (command.KernelNameDirectiveNode is null) { context.Fail(message: $"Missing required #!{Name} details."); return; } var parseResult = command.KernelNameDirectiveNode.GetDirectiveParseResult(); var name = parseResult.ValueForOption <string>("--name"); var value = command.LanguageNode.Text.Trim(); await SetVariableAsync(name, value); if (parseResult.ValueForOption("--mime-type") is string mimeType) { await context.DisplayAsync(value, mimeType); } }