2

我想允许在 Jint 中运行的脚本访问我已设置为命名空间的预先存在的 API。我的意思是我有一个包含 API 的命名空间,包括其他命名空间。我不想让脚本访问其余代码——包括 .Net 框架。

我已经在 J​​int 论坛上发布了这个:http: //jint.codeplex.com/discussions/310772 但是,没有不尊重他们,但论坛似乎不是很活跃,我希望能够回答这个问题尽快,所以我也在这里发帖。

不久前,ThomasMaierhofer 实现了与此类似的东西,我可能可以修改以在这里解决这个问题:http: //jint.codeplex.com/discussions/211291

对于我缺乏经验的大脑来说,这似乎是向引擎公开 API 的一种非常巧妙的方式,但我以前从未见过这样的做法。

所以我的问题是:这行得通吗?如果是这样,为什么以前没有这样做过?有什么方法可以在不修改 Jint 源的情况下实现这一点,以便在新版本可用时轻松更新 Jint .dll?

编辑: 我当前的 API 由多个类组成,每个类都有多个功能。我可以使用 SetParameter 完全公开这些类的特定实例。Jint 还有一个 AllowClr 属性,它允许脚本通过完全限定名称空间来访问 CLR。这是他们提供的示例代码,演示如果将其设置为 false 会发生什么。来源: http://jint.codeplex.com/wikipage?title= Using%20.NET%20classes%20from%20scripts

string stringBuilder = @"
    var sb = new System.Text.StringBuilder();
    return sb.ToString();
    ";
var engine = new JintEngine();
engine.AllowClr = false;
engine.Run(stringBuilder); // throws a SecurityException

我想允许这样做,但仅限于特定的命名空间,而不是其他所有内容。我希望这能让问题更清楚。

谢谢你的帮助,

山姆。

PS 我在 VB.Net 工作,但涉及 C# 的答案很好。

4

1 回答 1

1

Jint 基本上有两种方法来实现你想要SetParameter的:你可以传递一个可以从解释器调用的对象实例,方法是使用你决定的名称访问它,以及SetFunction()让引擎直接调用托管代码中的函数. 如果您想通过某种约定以编程方式公开大量对象,则可以使用反射,我认为这将满足您的要求而无需修改 jint 代码。

于 2012-02-16T13:24:40.180 回答