代码之家  ›  专栏  ›  技术社区  ›  NathanD

从.NET应用程序引用Google的V8引擎

  •  35
  • NathanD  · 技术社区  · 17 年前

    关于如何在C#中与这种类型的DLL进行互操作,有什么想法吗?另外,我也愿意接受关于SpiderMonkey或其他JS引擎的其他建议。

    提前谢谢。

    我能够使用Ryan的解决方案。我刚刚更新了对最新from trunk构建的引用。效果很好。谢谢你,瑞安。

    8 回复  |  直到 16 年前
        1
  •  34
  •   InteXX    7 年前

    我意识到这可能不是你问题的确切答案,但我想我会投入我的2美分,因为我怀疑很多人是否尝试过这一点。

    我通过创建一个使用混合模式C++的托管包装来工作。还有其他方法可以实现,但我打算尝试制作一个可以从任何.NET语言使用的完整包装器。

    让lib以这样一种方式编译,使其可以包含在混合模式项目中,这是一个小小的挑战。我必须修改用于/MD和/MDd的运行库(在SConstruct文件中),以便它与/clr开关兼容。

    以下是我的一个测试应用程序的使用情况的快速示例:

    V8DotNet.Shell shell = new V8DotNet.Shell();
    
    shell.ExecuteScript(@"print('V8 version is: ' + version());");
    

    它还可以运行更复杂的脚本,比如base64编码器。但现在我只能从C++方面添加自定义项目。

    我愿意提供更多的信息+代码,如果有人感兴趣,因为我可能永远不会拿起这个项目回来。但是,我担心在这里发布一篇文章会有太多的代码,所以我们必须找到其他媒介,比如谷歌代码或codePlex。


    这个项目很早,我是C++的业余爱好者,所以不要太抱太大希望。此外,该项目是在chrome发布后创建/完成的,因此包含的v8版本可能比较旧。

    这就是说,这里是: http://ryanscook.com/Files/V8-DotNet.zip (21.5 MB)

    在软件包中,您会发现以下感兴趣的项目:

    这 是具有托管 用于测试。

    依赖项\V8- 这是我的V8代码

        2
  •  18
  •   Michel Boissé    16 年前

    http://javascriptdotnet.codeplex.com/

    它允许您从.NET创建一个V8上下文,并在其中注册CLI对象,以便您可以操纵它们并从Javascript代码中调用成员。它在运行时编译Javascript。

    过来看。

        3
  •  13
  •   Shaun    16 年前

    v8sharp . 它支持在.NET应用程序内部执行JS。它还允许您向v8引擎注册.NET类型,以便JS代码可以与.NET代码交互。我正在添加对挂钩功能/委托支持的支持。

        4
  •  1
  •   Orion Edwards    17 年前

    are building a real javascript - not "JScript" - runtime (以及IronPython、IronRuby和VB10)使用DLR在CLR上运行,但我找不到任何下载或内容。也许这将与C#4一起到达?

        5
  •  1
  •   James Wilkins    7 年前

    https://www.nuget.org/packages/V8.Net/

    它允许您以比许多其他包装更低的级别轻松地将代码与V8集成。它还支持.NET4.6.1+和.NETStandard2.0+(.NETCore)。

        6
  •  0
  •   Jonathan C Dickinson    17 年前

        7
  •  0
  •   Community Mohan Dere    9 年前

    我想加塔皮亚已经取代了 js.net 具有 jish

        8
  •  0
  •   Stefan Steiger Marco van de Voort    8 年前

    巫术。

    vroomjs-core

    执行一些Javascript:

    using (var engine = new JsEngine())
    {
        using (var context = engine.CreateContext())
        {
            var x = (double)context.Execute("3.14159+2.71828");
            Console.WriteLine(x);  // prints 5.85987
        }
    }
    

    using (JsEngine js = new JsEngine(4, 32))
    {
        using (JsContext context = js.CreateContext())
        {
            // Create a global variable on the JS side.
            context.Execute("var x = {'answer':42, 'tellme':function (x) { return x+' '+this.answer; }}");
            // Get it and use "dynamic" to tell the compiler to use runtime binding.
            dynamic x = context.GetVariable("x");
            // Call the method and print the result. This will print:
            // "What is the answer to ...? 42"
            Console.WriteLine(x.tellme("What is the answer to ...?"));
        }
    }
    

    从Javascript访问CLR对象的属性和调用方法:

    class Test
    {
        public int Value { get; set; }
        public void PrintValue(string msg)
        {
            Console.WriteLine(msg+" "+Value);
        }
    }
    
    using (JsEngine js = new JsEngine(4, 32))
    {
        using (JsContext context = js.CreateContext())
        {
            context.SetVariable("m", new Test());
            // Sets the property from Javascript.
            context.Execute("m.Value = 42");
            // Call a method on the CLR object from Javascript. This prints:
            // "And the answer is (again!): 42"
            context.Execute("m.PrintValue('And the answer is (again!):')");
        }
    }
    
        9
  •  0
  •   Rafaeltab    5 年前

    因为这个问题是前一段时间发布的,所以我想我应该提供一些更新。

    ClearScript 脚本引擎,支持V8、JScript和VBScript。

    添加一个WPF按钮类型并创建一个也没有问题。github中有一些很好的例子,因此我建议阅读本文的人快速浏览一下。