C#怎么执行JavaScript(或者其他语言)代码?

cheelumbill 2010-01-19 11:52:18
想用C#做一个东西,能用JavaScript或者其他语言来控制。

比如输入一段JavaScript的代码
var a=1+2;
能够执行。

网上查了下,没找到什么有帮助的,希望高手帮忙,我不想自己写个JS的解释器……
希望能给我些相关的参考,先在这谢谢了!

P.S.
1:不是ASP.net的,也最好不是用JScript.net的编译器的方法。
2:需要内嵌入自定义的对象
比如我在C#下定了一个叫abc的类,能在JS框架下使用,当然曲线的使用也行,或者只能调用一个C#下定义的对象的相关方法也行,总之,这之间能交互的。

Thanks!
...全文
381 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dobzhansky 2010-01-20
  • 打赏
  • 举报
回复
SpiderMonkey 对 E4X(ECMAScript for XML) 支持比较好,
比较欢喜这个

sample from tutorial:
var element1 = <foo>
<bar/>
</foo>;
var element2 = <baz/>;
element1.bar.appendChild(element2);
element1["bar"].appendChild(<quux/>);
vrhero 2010-01-20
  • 打赏
  • 举报
回复
对了,Dobzhansky这么一说才想起来...还有WScript和WshShell都支持jscript编程,可以直接调用...
Dobzhansky 2010-01-20
  • 打赏
  • 举报
回复
微软的 js 解析器的参考:
http://code.google.com/p/mbunit-javascript/
代码路径:
/trunk/MbUnit.JavaScript/Engines/Microsoft

本质是实现接口 IActiveScriptSite

[ComImport]
[Guid("DB01A1E3-A42B-11cf-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IActiveScriptSite
{
/// <summary>
///
/// </summary>
/// <param name="lcid"></param>
void GetLCID(out int lcid);
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <param name="returnMask"></param>
/// <param name="item"></param>
/// <param name="typeInfo"></param>
void GetItemInfo(
string name,
ScriptInfo returnMask,
[Out] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown)] object[] item,
[Out] [MarshalAs(UnmanagedType.LPArray)] IntPtr[] typeInfo);
/// <summary>
///
/// </summary>
/// <param name="version"></param>
void GetDocVersionString(out string version);
/// <summary>
///
/// </summary>
/// <param name="result"></param>
/// <param name="exceptionInfo"></param>
void OnScriptTerminate(object result, EXCEPINFO exceptionInfo);
/// <summary>
///
/// </summary>
/// <param name="scriptState"></param>
void OnStateChange(ScriptState scriptState);
/// <summary>
///
/// </summary>
/// <param name="scriptError"></param>
void OnScriptError(IActiveScriptError scriptError);
/// <summary>
///
/// </summary>
void OnEnterScript();
/// <summary>
///
/// </summary>
void OnLeaveScript();
}


接口
  [ComImport]
[Guid("BB1A2AE2-A4F9-11cf-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IActiveScriptParse32

是主要功能接口.

SpiderMonkey 有个 dotnet 封装,
http://spidermonkeydotnet.codeplex.com/,
带外成本是此程序集和一个 常规 dll, js.dll

如果使用 Firefox 下的 js3250, 则加上 nspr4.dll
Dobzhansky 2010-01-20
  • 打赏
  • 举报
回复
如果不用微软的, 可以用 google 的 V8, Mozilla 的 spiderMonkey

我试过微软的 jscript, spidermonkey, 比较喜欢 spidermonkey
Dobzhansky 2010-01-20
  • 打赏
  • 举报
回复
http://code.google.com/p/mbunit-javascript/
cwblaze 2010-01-20
  • 打赏
  • 举报
回复
.NET平台不是支持JScript的?
直接写好编译成IL,再反编译成C#。
Dobzhansky 2010-01-20
  • 打赏
  • 举报
回复
微软的 JScript 是可以编程的, 给一个程序提供执行 js 脚本的能力,
同时还支持程序中的类暴露给 js 脚本,
就好比浏览器的 window , document 一样.

搜索关键词 IActiveScriptSite, JScript

可以参照的 code base(有够全面, 就是复杂)
vrhero 2010-01-20
  • 打赏
  • 举报
回复
解释型语言是必须要有解释器的...

.NET中解释器倒是有一个,System.Windows.Forms.WebBrowser...其实就是IE,去看MSDN吧...
cheelumbill 2010-01-20
  • 打赏
  • 举报
回复
To:Lost_Painting

额~~~~~
第一个,难道没有什么现成的解释器可用?
第二个,不明白。

Thanks!
鸭梨山大帝 2010-01-20
  • 打赏
  • 举报
回复
1."我不想自己写个JS的解释器……"
你真的需要写个解释器... ...
而且是拿C#写一个解释器

2."比如我在C#下定了一个叫abc的类,能在JS框架下使用,当然曲线的使用也行,或者只能调用一个C#下定义的对象的相关方法也行,总之,这之间能交互的。"


function getobj()
{
var obj="<%=GetObject()%>";
alert (obj);
}



public static string GetObject
{
return "hahaha";
}
nixiang12 2010-01-20
  • 打赏
  • 举报
回复
标记
cheelumbill 2010-01-20
  • 打赏
  • 举报
回复
谢谢各位高人,我去试一下,晚上来结贴。
To vrhero
1:用WebBrowser怎么和C#“交互"呢?我只知道怎么让他们传递写数值。
2:WScript和WshShell,同上。

To Dobzhansky
1:谢谢指点,昨天只看到了需要调用JScript编译器来解决这个的办法。
2:spiderMonkey似乎在.net里引用有点麻烦。
cheelumbill 2010-01-20
  • 打赏
  • 举报
回复
已经搞定了,谢谢各位高人。
ouc_ajax 2010-01-19
  • 打赏
  • 举报
回复
好牛的需求。
坐等大牛。

Up!

111,122

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧