使用jint从c#

时间:2017-01-30 07:46:27

标签: javascript c# d3.js svg jint

我目前正在开发一个项目,我们需要根据一些输入数据生成一些SVG。目前,所有这些SVG生成都是使用d3库在javascript中实现的。请注意,我的目标是能够重用此逻辑而不是全部实现它。

我的问题是我希望能够从C#调用这个javascript。

我尝试过使用PhantomJS并且能够生成SVG,但我不满意,因为

  • 每次我想调用javascript它都会启动一个新进程而我 注意到它使用了大量的内存(在我的情况下,我看到了100 MB 在我的情况下太多了)
  • 看起来有点不稳定。我有 在某些情况下,流程只是暂停了
  • 开发(在javascript方面)非常令人沮丧,因为它很难调试

因为我对PhantomJS不满意,所以我也试过使用jint,这似乎很适合。不幸的是,我还没有成功地获得一个有效的例子。目前我正在使用AngleSharp来提供DOM,以便D3有一个写入其数据的位置。这给了我以下示例:

static void TestJint()
    {
        //We require a custom configuration with JavaScript and CSS
        var config = Configuration.Default.WithJavaScript().WithCss();
        //Let's create a new parser using this configuration
        var parser = new HtmlParser(config);

        //This is our sample source, we will do some DOM manipulation
        var source = "<!doctype html> <html><head></head> <body> </body></html>";
        var document = parser.Parse(source);



        var jintEngine = new Engine();

        jintEngine.SetValue("document", document.Implementation);


        jintEngine = jintEngine.Execute(File.ReadAllText("d3.min.js"));


        jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\").append(\"span\").text(\"Hello, world!\"); return 42;}");

        var res = jintEngine.Invoke("testFunc").ToObject();

    }

问题是行var res = jintEngine.Invoke(&#34; testFunc&#34;)。ToObject();抛出异常。

Exception screenshot

如果我尝试更换行

        jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\").append(\"span\").text(\"Hello, world!\"); return 42;}");

        jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\"); return 42;}");

然后该函数可以无任何异常地运行。通过使用逻辑稍微玩一下,我得出的结论是.append(\&#34; span \&#34;)会导致异常。

我有点陷入困境,所以我希望有人可能会有一个能让我指向正确方向的想法。

1 个答案:

答案 0 :(得分:0)

我已经找到了问题。

1)parser.Parse(source)返回的文件;没有实现d3使用的函数createElementNS。我通过使用委托调用的包装器来解决这个问题。

2)d3使用我没有设置的变量ownerDocument。所以我还要添加以下内容

jintEngine.SetValue("ownerDocument", new MyDocumentWrapper(document));

请注意,这并不能使整个d3库工作。我也注意到了d3.geopath()的一些问题,但是通过这些修复,我能够执行我的初始示例。