.NET应用内置脚本支持选型及IronPython暴露内部对象方法咨询
IronPython 向脚本环境暴露宿主方法与对象实现方案
IronPython 实现自定义方法、内部对象注入的核心依赖ScriptEngine和ScriptScope两个组件,其中ScriptScope对应脚本的全局命名空间,所有注入到该作用域的.NET对象、委托都可以在脚本中直接调用,实现逻辑和你提到的JINT方案完全对齐。
第一步:安装依赖
通过NuGet安装两个核心包:IronPython、Microsoft.Scripting,兼容.NET Framework 4.6+、.NET Core 3.1、.NET 5/6/7/8全版本.NET生态。第二步:初始化环境并注入自定义内容
对应你提供的JINT初始化逻辑,IronPython的实现示例如下:
using IronPython.Hosting; using Microsoft.Scripting.Hosting; public class ScriptHost { private ScriptEngine _engine; private ScriptScope _scope; protected virtual void InitializeEnvironment() { // 初始化IronPython引擎 _engine = Python.CreateEngine(); // 创建脚本全局作用域 _scope = _engine.CreateScope(); // 注入工具函数,和JINT的AddFunction逻辑完全对应 _scope.SetVariable("print", new Action<object>(WriteLine)); _scope.SetVariable("log", new Action<object>(WriteLine)); _scope.SetVariable("cls", new Action(ClearScreen)); // 注入交互功能函数 _scope.SetVariable("alert", new Action<object>(ShowAlert)); _scope.SetVariable("confirm", new Func<object, bool>(ShowConfirm)); _scope.SetVariable("prompt", new Func<object, object, string>(ShowPrompt)); // 如果需要把整个宿主实例暴露给脚本,直接注入即可 _scope.SetVariable("appHost", this); } // 以下为宿主侧自行实现的业务方法 public void WriteLine(object content) { // 自定义输出逻辑 } public void ClearScreen() { // 清屏逻辑 } public void ShowAlert(object message) { // 弹窗提示逻辑 } public bool ShowConfirm(object message) { // 确认框逻辑 return true; } public string ShowPrompt(object message, object defaultValue) { // 输入框逻辑 return ""; } // 执行用户输入的脚本 public void RunUserScript(string scriptCode) { _engine.Execute(scriptCode, _scope); } }
用户编写IronPython脚本时可以直接调用注入的内容,示例脚本如下:
# 直接调用全局注入的函数 log("脚本启动运行") userName = prompt("请输入用户名", "默认用户") if confirm(f"确认输出用户名 {userName} 吗?"): print(userName) # 调用注入的宿主对象的方法 appHost.ClearScreen()
- 注意事项
若开放给用户编写任意脚本,建议不要默认导入.NET系统命名空间,也不要直接暴露底层业务对象,仅注入你封装好的安全方法即可,避免恶意脚本操作宿主程序或系统资源。执行脚本时建议包裹try-catch捕获异常,可通过_engine.GetService<ExceptionOperations>()将Python运行时异常转换为可读的.NET异常信息。
内容的提问来源于stack exchange,提问作者Franz Gsell
相关产品推荐
相关产品推荐

