You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:24:03