我想允许在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
我想允许这样,但仅针对特定的命名空间,而不是其他任何内容。我希望这会使问题更加清晰。
感谢您的帮助,
萨姆。
P.S。我在VB.Net工作,但涉及C#的答案很好。
答案 0 :(得分:1)
Jint基本上有两种方法可以实现你想要的:SetParameter
,你可以传递一个可以从解释器调用的对象实例,方法是用你决定的名字访问它,SetFunction()
,让引擎直接调用托管代码中的函数。如果你想通过某种约定以编程方式公开很多对象,你可以使用反射,我认为这可以满足你的要求,而不需要修改jint代码。