我希望允许在 Jint 中运行的脚本访问我设置为命名空间的预先存在的 API。我的意思是我有一个包含 API 的命名空间,包括其他命名空间。我不想允许脚本访问其余代码 - 包括 .Net 框架。
我已经在 Jint 论坛上发布了此内容: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
我想允许这样做,但仅针对特定 namespace ,而不是其他所有内容。我希望这能让问题更清楚。
感谢您的帮助,
山姆。
附注我正在 VB.Net 中工作,但涉及 C# 的答案很好。
最佳答案
Jint 基本上有两种方法来实现你想要的:SetParameter
,你可以传递一个对象实例,通过使用你决定的名称访问它,可以从解释器调用该实例,以及 SetFunction()
,让引擎直接调用托管代码中的函数。如果您想通过某种约定以编程方式公开大量对象,您可以使用反射,并且我认为这将满足您的要求而无需修改 jint 代码。
关于javascript - 向 Jint 公开特定 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9277433/