From f394d64e91cd57ce30cb0ad76847cf023bad2471 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 07:14:11 +0200 Subject: [PATCH 1/7] =?UTF-8?q?=D0=92=D1=8B=D1=80=D0=BE=D0=B2=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B8=20=D0=B6=D0=B8=D0=B7=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20=D1=86=D0=B8=D0=BA=D0=BB=20engine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine.HostedScript/Process.cs | 7 ++----- src/TestApp/MainWindow.xaml.cs | 4 ++-- src/oscript/CgiBehavior.cs | 2 +- src/oscript/CheckSyntaxBehavior.cs | 2 +- src/oscript/ShowCompiledBehavior.cs | 2 +- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/ScriptEngine.HostedScript/Process.cs b/src/ScriptEngine.HostedScript/Process.cs index 39a36d266..a21d59c0f 100644 --- a/src/ScriptEngine.HostedScript/Process.cs +++ b/src/ScriptEngine.HostedScript/Process.cs @@ -12,11 +12,10 @@ namespace ScriptEngine.HostedScript { public class Process { - ScriptingEngine _engine; - + readonly ScriptingEngine _engine; readonly IHostApplication _host; readonly IExecutableModule _module; - private IBslProcess _bslProcess; + private readonly IBslProcess _bslProcess; internal Process( IBslProcess process, @@ -51,8 +50,6 @@ public int Start() finally { _engine.Debugger.NotifyProcessExit(exitCode); - _engine.Dispose(); - _engine = null; } return exitCode; diff --git a/src/TestApp/MainWindow.xaml.cs b/src/TestApp/MainWindow.xaml.cs index 320401b17..21887cc99 100644 --- a/src/TestApp/MainWindow.xaml.cs +++ b/src/TestApp/MainWindow.xaml.cs @@ -159,7 +159,7 @@ private HostedScriptEngine CreateEngine() private void Button_Click(object sender, RoutedEventArgs e) { - var hostedScript = CreateEngine(); + using var hostedScript = CreateEngine(); hostedScript.Initialize(); var src = hostedScript.Loader.FromString(txtCode.Text); @@ -205,7 +205,7 @@ private void Button_Click_1(object sender, RoutedEventArgs e) var host = new Host(result, l_args.ToArray()); SystemLogger.SetWriter(host); - var hostedScript = CreateEngine(); + using var hostedScript = CreateEngine(); var src = SourceCodeBuilder.Create() .FromSource(new EditedFileSource(txtCode.Text, _currentDocPath)) diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs index 3354a0597..9a874da1d 100644 --- a/src/oscript/CgiBehavior.cs +++ b/src/oscript/CgiBehavior.cs @@ -68,7 +68,7 @@ private int RunCGIMode(string scriptFile) e.AddAssembly(GetType().Assembly); }); - var engine = ConsoleHostBuilder.Build(builder); + using var engine = ConsoleHostBuilder.Build(builder); var request = new WebRequestContext(engine.Services.Resolve().MaxBytesInMemory); engine.InjectGlobalProperty("ВебЗапрос", "WebRequest", request, true); diff --git a/src/oscript/CheckSyntaxBehavior.cs b/src/oscript/CheckSyntaxBehavior.cs index aa285ec6e..3148fd1e4 100644 --- a/src/oscript/CheckSyntaxBehavior.cs +++ b/src/oscript/CheckSyntaxBehavior.cs @@ -28,7 +28,7 @@ public CheckSyntaxBehavior(string path, string envFile, bool isCgi = false) public override int Execute() { var builder = ConsoleHostBuilder.Create(_path); - var hostedScript = ConsoleHostBuilder.Build(builder); + using var hostedScript = ConsoleHostBuilder.Build(builder); hostedScript.Initialize(); if (_isCgi) diff --git a/src/oscript/ShowCompiledBehavior.cs b/src/oscript/ShowCompiledBehavior.cs index 5be120562..cf257d264 100644 --- a/src/oscript/ShowCompiledBehavior.cs +++ b/src/oscript/ShowCompiledBehavior.cs @@ -23,7 +23,7 @@ public ShowCompiledBehavior(string path) public override int Execute() { var builder = ConsoleHostBuilder.Create(_path); - var hostedScript = ConsoleHostBuilder.Build(builder); + using var hostedScript = ConsoleHostBuilder.Build(builder); hostedScript.Initialize(); var source = hostedScript.Loader.FromFile(_path); From c0ebf843dfe0689de72d8d6f061b22013f258cf0 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 07:31:16 +0200 Subject: [PATCH 2/7] =?UTF-8?q?=D0=A3=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B6=D0=B8=D0=B7=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC?= =?UTF-8?q?=20=D1=86=D0=B8=D0=BA=D0=BB=D0=BE=D0=BC=20WebRequestContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/oscript/CgiBehavior.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs index 9a874da1d..e2bc0c48d 100644 --- a/src/oscript/CgiBehavior.cs +++ b/src/oscript/CgiBehavior.cs @@ -69,8 +69,7 @@ private int RunCGIMode(string scriptFile) }); using var engine = ConsoleHostBuilder.Build(builder); - - var request = new WebRequestContext(engine.Services.Resolve().MaxBytesInMemory); + using var request = new WebRequestContext(engine.Services.Resolve().MaxBytesInMemory); engine.InjectGlobalProperty("ВебЗапрос", "WebRequest", request, true); engine.InjectObject(this); @@ -93,8 +92,6 @@ private int RunCGIMode(string scriptFile) if (!_isContentEchoed) Echo(""); - request.Dispose(); - return exitCode; } From 9dd92e8bb355ced67d98bea18d83b030a2d5903e Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 08:22:12 +0200 Subject: [PATCH 3/7] =?UTF-8?q?=D0=97=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B0=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=B0=20=D1=81=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=B2=20=D0=BE=D0=B4=D0=BD=D0=BE=D0=BC=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HostedScriptEngine.cs | 48 +++++++++++++++---- src/ScriptEngine.HostedScript/Process.cs | 33 ++++++------- src/TestApp/MainWindow.xaml.cs | 14 +----- src/oscript/CgiBehavior.cs | 15 +----- src/oscript/ConsoleApplicationHost.cs | 14 +----- 5 files changed, 57 insertions(+), 67 deletions(-) diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 6ed02ed64..99478c454 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -12,7 +12,6 @@ This Source Code Form is subject to the terms of the using OneScript.Compilation; using OneScript.Contexts; using OneScript.DependencyInjection; -using OneScript.Execution; using OneScript.StandardLibrary; using OneScript.StandardLibrary.Tasks; using ScriptEngine.Machine.Contexts; @@ -89,6 +88,17 @@ public ICompilerFrontend GetCompilerService() return compilerSvc; } + /// + /// Создаёт процесс выполнения скрипта: инициализация, компиляция исходника, подготовка к запуску. + /// + /// Хост-приложение для взаимодействия со скриптом. + /// Исходный код скрипта. + /// Процесс, готовый к вызову . + /// + /// При ошибке компиляции или подготовки исключение пробрасывается вызывающему коду. + /// Уведомление отладчика о завершении процесса выполняет вызывающий код + /// (например, ). + /// public Process CreateProcess(IHostApplication host, SourceCode src) { Initialize(); @@ -102,18 +112,40 @@ public Process CreateProcess(IHostApplication host, SourceCode src) var compilerSvc = GetCompilerService(); DefineConstants(compilerSvc); - IExecutableModule module; var bslProcess = _engine.NewProcess(); + var module = compilerSvc.Compile(src, bslProcess); + return InitProcess(bslProcess, module); + } + + /// + /// Создаёт и запускает процесс скрипта, возвращает код завершения. + /// + /// Хост-приложение для взаимодействия со скриптом. + /// Исходный код скрипта. + /// + /// Код завершения скрипта; при ошибке создания/выполнения — 1 + /// после вывода информации об исключении через . + /// + /// + /// Уведомляет отладчик о завершении процесса как при успешном, так и при аварийном исходе. + /// Прерывание скрипта () обрабатывается в + /// и возвращается как штатный код выхода. + /// + public int RunProcess(IHostApplication host, SourceCode source) + { try { - module = compilerSvc.Compile(src, bslProcess); + var process = CreateProcess(host, source); + var exitCode = process.Start(); + _engine.Debugger.NotifyProcessExit(exitCode); + return exitCode; } - catch (CompilerException) + catch (Exception e) { _engine.Debugger.NotifyProcessExit(1); - throw; + host.ShowExceptionInfo(e); + return 1; } - return InitProcess(bslProcess, host, module); } private void DefineConstants(ICompilerFrontend compilerSvc) @@ -139,11 +171,11 @@ public void SetGlobalEnvironment(IHostApplication host, SourceCode src) _globalCtx.InitInstance(); } - private Process InitProcess(IBslProcess bslProcess, IHostApplication host, IExecutableModule module) + private Process InitProcess(IBslProcess bslProcess, IExecutableModule module) { Initialize(); - var process = new Process(bslProcess, host, module, _engine); + var process = new Process(bslProcess, module, _engine); return process; } diff --git a/src/ScriptEngine.HostedScript/Process.cs b/src/ScriptEngine.HostedScript/Process.cs index a21d59c0f..baa769dc1 100644 --- a/src/ScriptEngine.HostedScript/Process.cs +++ b/src/ScriptEngine.HostedScript/Process.cs @@ -4,55 +4,50 @@ This Source Code Form is subject to the terms of the was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ -using System; using OneScript.Execution; using ScriptEngine.Machine; namespace ScriptEngine.HostedScript { + /// + /// Скомпилированный процесс выполнения скрипта. + /// public class Process { readonly ScriptingEngine _engine; - readonly IHostApplication _host; readonly IExecutableModule _module; private readonly IBslProcess _bslProcess; internal Process( IBslProcess process, - IHostApplication host, IExecutableModule src, ScriptingEngine runtime) { - _host = host; _engine = runtime; _module = src; _bslProcess = process; } + /// + /// Запускает выполнение скрипта. + /// + /// + /// 0 при успешном завершении; код выхода при прерывании скрипта. + /// + /// + /// Прочие исключения пробрасываются вызывающему коду. + /// public int Start() { - int exitCode = 0; - try { _engine.NewObject(_module, _bslProcess); - exitCode = 0; + return 0; } catch (ScriptInterruptionException e) { - exitCode = e.ExitCode; - } - catch (Exception e) - { - _host.ShowExceptionInfo(e); - exitCode = 1; + return e.ExitCode; } - finally - { - _engine.Debugger.NotifyProcessExit(exitCode); - } - - return exitCode; } } diff --git a/src/TestApp/MainWindow.xaml.cs b/src/TestApp/MainWindow.xaml.cs index 21887cc99..07520e3de 100644 --- a/src/TestApp/MainWindow.xaml.cs +++ b/src/TestApp/MainWindow.xaml.cs @@ -212,20 +212,9 @@ private void Button_Click_1(object sender, RoutedEventArgs e) .WithName(_currentDocPath) .Build(); - Process process = null; - try - { - process = hostedScript.CreateProcess(host, src); - } - catch (Exception exc) - { - host.Echo(exc.Message); - return; - } - result.AppendText("Script started: " + DateTime.Now.ToString() + "\n"); sw.Start(); - var returnCode = process.Start(); + var returnCode = hostedScript.RunProcess(host, src); sw.Stop(); if (returnCode != 0) { @@ -233,7 +222,6 @@ private void Button_Click_1(object sender, RoutedEventArgs e) } result.AppendText("\nScript completed: " + DateTime.Now.ToString()); result.AppendText("\nDuration: " + sw.Elapsed.ToString() + "\n"); - } private static string GetFileDialogFilter() diff --git a/src/oscript/CgiBehavior.cs b/src/oscript/CgiBehavior.cs index e2bc0c48d..f0781bf9e 100644 --- a/src/oscript/CgiBehavior.cs +++ b/src/oscript/CgiBehavior.cs @@ -74,20 +74,7 @@ private int RunCGIMode(string scriptFile) engine.InjectObject(this); var source = engine.Loader.FromFile(scriptFile); - - Process process; - - try - { - process = engine.CreateProcess(this, source); - } - catch (Exception e) - { - ShowExceptionInfo(e); - return 1; - } - - var exitCode = process.Start(); + var exitCode = engine.RunProcess(this, source); if (!_isContentEchoed) Echo(""); diff --git a/src/oscript/ConsoleApplicationHost.cs b/src/oscript/ConsoleApplicationHost.cs index 45b2bc11c..412ee0384 100644 --- a/src/oscript/ConsoleApplicationHost.cs +++ b/src/oscript/ConsoleApplicationHost.cs @@ -33,19 +33,7 @@ public void Write(string text) public int RunProcess(HostedScriptEngine engine, SourceCode source) { SystemLogger.SetWriter(this); - - Process process; - try - { - process = engine.CreateProcess(this, source); - } - catch (Exception e) - { - ShowExceptionInfo(e); - return 1; - } - - return process.Start(); + return engine.RunProcess(this, source); } } } From b22056533e1de34262b9685712bf10f17df63730 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 09:01:58 +0200 Subject: [PATCH 4/7] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=20=D0=B4?= =?UTF-8?q?=D0=B2=D0=BE=D0=B9=D0=BD=D0=BE=D0=B9=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=20Initialize=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HostedScriptEngine.cs | 14 ++--------- src/ScriptEngine.HostedScript/Process.cs | 23 +++++++++++++++---- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 99478c454..ddb2a96de 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -84,7 +84,7 @@ public ICompilerFrontend GetCompilerService() { var compilerSvc = _engine.GetCompilerService(); compilerSvc.FillSymbols(typeof(UserScriptContextInstance)); - + return compilerSvc; } @@ -112,9 +112,7 @@ public Process CreateProcess(IHostApplication host, SourceCode src) var compilerSvc = GetCompilerService(); DefineConstants(compilerSvc); - var bslProcess = _engine.NewProcess(); - var module = compilerSvc.Compile(src, bslProcess); - return InitProcess(bslProcess, module); + return Process.Create(_engine, compilerSvc, src); } /// @@ -171,14 +169,6 @@ public void SetGlobalEnvironment(IHostApplication host, SourceCode src) _globalCtx.InitInstance(); } - private Process InitProcess(IBslProcess bslProcess, IExecutableModule module) - { - Initialize(); - - var process = new Process(bslProcess, module, _engine); - return process; - } - public void Dispose() { _engine?.Dispose(); diff --git a/src/ScriptEngine.HostedScript/Process.cs b/src/ScriptEngine.HostedScript/Process.cs index baa769dc1..5159a8c51 100644 --- a/src/ScriptEngine.HostedScript/Process.cs +++ b/src/ScriptEngine.HostedScript/Process.cs @@ -4,7 +4,10 @@ This Source Code Form is subject to the terms of the was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. ----------------------------------------------------------*/ + +using OneScript.Compilation; using OneScript.Execution; +using OneScript.Sources; using ScriptEngine.Machine; namespace ScriptEngine.HostedScript @@ -14,11 +17,11 @@ namespace ScriptEngine.HostedScript /// public class Process { - readonly ScriptingEngine _engine; - readonly IExecutableModule _module; + private readonly ScriptingEngine _engine; + private readonly IExecutableModule _module; private readonly IBslProcess _bslProcess; - internal Process( + private Process( IBslProcess process, IExecutableModule src, ScriptingEngine runtime) @@ -28,6 +31,19 @@ internal Process( _bslProcess = process; } + /// + /// Создаёт процесс: выделяет runtime-процесс, компилирует исходник, готовит к запуску. + /// + internal static Process Create( + ScriptingEngine engine, + ICompilerFrontend compiler, + SourceCode source) + { + var bslProcess = engine.NewProcess(); + var module = compiler.Compile(source, bslProcess); + return new Process(bslProcess, module, engine); + } + /// /// Запускает выполнение скрипта. /// @@ -49,6 +65,5 @@ public int Start() return e.ExitCode; } } - } } From 437c39c2faf0225ac83e0d59233cae09f7342807 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 09:24:21 +0200 Subject: [PATCH 5/7] =?UTF-8?q?DefineConstants=20=D0=BF=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=8F=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=D0=BE=20?= =?UTF-8?q?=D0=B2=D1=81=D0=B5=D1=85=20=D0=BF=D1=83=D1=82=D1=8F=D1=85=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20GetCompilerService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ScriptEngine.HostedScript/HostedScriptEngine.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index ddb2a96de..391d5d6a3 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -84,7 +84,7 @@ public ICompilerFrontend GetCompilerService() { var compilerSvc = _engine.GetCompilerService(); compilerSvc.FillSymbols(typeof(UserScriptContextInstance)); - + DefineConstants(compilerSvc); return compilerSvc; } @@ -111,7 +111,6 @@ public Process CreateProcess(IHostApplication host, SourceCode src) } var compilerSvc = GetCompilerService(); - DefineConstants(compilerSvc); return Process.Create(_engine, compilerSvc, src); } From 9d68dd66f8769bb0476e900729feed6d11b99b2a Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sun, 23 Aug 2026 10:11:04 +0200 Subject: [PATCH 6/7] =?UTF-8?q?=D0=A1=D0=BE=D0=B1=D1=80=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B6?= =?UTF-8?q?=D0=B8=D0=B7=D0=BD=D0=B5=D0=BD=D0=BD=D1=8B=D0=BC=20=D1=86=D0=B8?= =?UTF-8?q?=D0=BA=D0=BB=D0=BE=D0=BC=20=D0=BE=D1=82=D0=BB=D0=B0=D0=B4=D1=87?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D0=B2=20RunProcess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HostedScriptEngine.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs index 391d5d6a3..d2c6dfc5d 100644 --- a/src/ScriptEngine.HostedScript/HostedScriptEngine.cs +++ b/src/ScriptEngine.HostedScript/HostedScriptEngine.cs @@ -96,19 +96,11 @@ public ICompilerFrontend GetCompilerService() /// Процесс, готовый к вызову . /// /// При ошибке компиляции или подготовки исключение пробрасывается вызывающему коду. - /// Уведомление отладчика о завершении процесса выполняет вызывающий код - /// (например, ). /// public Process CreateProcess(IHostApplication host, SourceCode src) { Initialize(); SetGlobalEnvironment(host, src); - - if (_engine.Debugger.IsEnabled) - { - _engine.Debugger.Start(); - _engine.Debugger.GetSession().WaitReadyToRun(); - } var compilerSvc = GetCompilerService(); return Process.Create(_engine, compilerSvc, src); @@ -124,7 +116,8 @@ public Process CreateProcess(IHostApplication host, SourceCode src) /// после вывода информации об исключении через . /// /// - /// Уведомляет отладчик о завершении процесса как при успешном, так и при аварийном исходе. + /// Управляет сессией отладчика: старт и ожидание готовности перед созданием процесса, + /// уведомление о завершении при любом исходе. /// Прерывание скрипта () обрабатывается в /// и возвращается как штатный код выхода. /// @@ -132,6 +125,12 @@ public int RunProcess(IHostApplication host, SourceCode source) { try { + if (_engine.Debugger.IsEnabled) + { + _engine.Debugger.Start(); + _engine.Debugger.GetSession().WaitReadyToRun(); + } + var process = CreateProcess(host, source); var exitCode = process.Start(); _engine.Debugger.NotifyProcessExit(exitCode); From c6fdb44354782e02a3f1121ba862d354587d96bf Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Fri, 4 Sep 2026 09:09:26 +0200 Subject: [PATCH 7/7] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B2=20TestApp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/TestApp/MainWindow.xaml.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/TestApp/MainWindow.xaml.cs b/src/TestApp/MainWindow.xaml.cs index 07520e3de..d60cec9e5 100644 --- a/src/TestApp/MainWindow.xaml.cs +++ b/src/TestApp/MainWindow.xaml.cs @@ -410,11 +410,18 @@ public Host(TextBox output, string [] arguments = null) public void Echo(string str, MessageStatusEnum status = MessageStatusEnum.Ordinary) { - _output.Dispatcher.BeginInvoke(new Action(() => + void Append() { _output.AppendText(str + '\n'); _output.ScrollToEnd(); - })); + } + + // RunProcess вызывается с UI-потока: без синхронной записи + // ShowExceptionInfo оказывается после "Error detected" / "Script completed". + if (_output.Dispatcher.CheckAccess()) + Append(); + else + _output.Dispatcher.BeginInvoke(new Action(Append)); } public void ShowExceptionInfo(Exception exc)