fix: 修复某些js回调在突然终止后弹出的v8报错 (#3072)

Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com>
This commit is contained in:
躁动的氨气
2026-05-02 19:20:47 +08:00
committed by GitHub
parent dc1c25ee00
commit 6071b4096f
2 changed files with 42 additions and 7 deletions

View File

@@ -10,8 +10,10 @@ using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using BetterGenshinImpact.Core.Script.Dependence;
using BetterGenshinImpact.GameTask.Common;
using BetterGenshinImpact.View;
using Microsoft.ClearScript.JavaScript;
using Microsoft.Extensions.Logging;
namespace BetterGenshinImpact.Core.Script.Project;
@@ -32,6 +34,7 @@ public class ScriptProject
{
throw new DirectoryNotFoundException("脚本文件夹不存在:" + ProjectPath);
}
ManifestFile = Path.GetFullPath(Path.Combine(ProjectPath, "manifest.json"));
if (!File.Exists(ManifestFile))
{
@@ -49,6 +52,7 @@ public class ScriptProject
{
return null;
}
var stackPanel = new StackPanel
{
Margin = new Thickness(0, 0, 20, 0) // 给右侧滚动条留出位置
@@ -75,7 +79,7 @@ public class ScriptProject
private IScriptEngine BuildScriptEngine(PathingPartyConfig? partyConfig)
{
V8ScriptEngine engine = new V8ScriptEngine(V8ScriptEngineFlags.UseCaseInsensitiveMemberBinding | V8ScriptEngineFlags.EnableTaskPromiseConversion);
// packages 依赖和资源重载
var loader = new PackageDocumentLoader(ProjectPath);
engine.DocumentSettings.Loader = loader;
@@ -93,14 +97,14 @@ public class ScriptProject
return engine;
}
public async Task ExecuteAsync(dynamic? context = null, PathingPartyConfig? partyConfig=null)
public async Task ExecuteAsync(dynamic? context = null, PathingPartyConfig? partyConfig = null)
{
// 默认值
GlobalMethod.SetGameMetrics(1920, 1080);
// 加载代码
var code = await LoadCode();
var engine = BuildScriptEngine(partyConfig);
// 使用自定义加载器解析脚本文件
var loader = (PackageDocumentLoader)engine.DocumentSettings.Loader;
@@ -109,10 +113,11 @@ public class ScriptProject
// 写入配置的内容
engine.AddHostObject("settings", context);
}
try
{
bool useModule = Manifest.Library.Length != 0 ||
code.Contains("import ", StringComparison.Ordinal) ||
bool useModule = Manifest.Library.Length != 0 ||
code.Contains("import ", StringComparison.Ordinal) ||
code.Contains("export ", StringComparison.Ordinal);
if (useModule)
@@ -140,7 +145,16 @@ public class ScriptProject
}
finally
{
HtmlMaskWindow.CloseAll();
// 终止代码执行
try
{
engine.Interrupt();
}
catch (Exception e)
{
TaskControl.Logger.LogError(e, "中断脚本执行异常:" + e.Message);
}
engine.Dispose();
}
}
@@ -155,4 +169,4 @@ public class ScriptProject
return code;
}
}
}