示例#1
0
        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);
            }
        }
示例#3
0
        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);
            }
        }