【问题标题】:Exposing specific namespaces to Jint向 Jint 公开特定的命名空间
【发布时间】:2012-02-14 13:10:27
【问题描述】:

我想允许在 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

我想允许这样做,但只针对特定的命名空间,而不是其他所有内容。我希望这可以让问题更清楚。

感谢您的帮助,

山姆。

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

【问题讨论】:

    标签: javascript .net namespaces jint


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复,但是,除非我误解了它的工作原理,否则这并不能解决我的问题。我将编辑问题以添加更多详细信息。
    • 我已经扩展了这个问题。