使用jint从c使用d3调用javascript#

使用jint从c使用d3调用javascript#,javascript,c#,d3.js,svg,jint,Javascript,C#,D3.js,Svg,Jint,我目前正在从事一个项目,我们需要根据一些输入数据生成一些SVG。目前,所有SVG生成都是使用d3库在javascript中实现的。请注意,我的目标是能够重用此逻辑,而不是全面实现它 我的问题是,我希望能够从C#调用此javascript 我尝试过使用PhantomJS,并且我能够生成SVG,但是我不满意,因为 每次我想调用javascript时,它都会启动一个新进程,我 我注意到它使用了大量内存(在我的例子中,我看到了100MB) 这对我来说太过分了) 看起来有点不稳定。我有 在某些情况下,进

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

我的问题是,我希望能够从C#调用此javascript

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

  • 每次我想调用javascript时,它都会启动一个新进程,我 我注意到它使用了大量内存(在我的例子中,我看到了100MB) 这对我来说太过分了)
  • 看起来有点不稳定。我有 在某些情况下,进程只是挂起
  • 开发(在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();

    }

然后,该函数就能够在没有任何异常的情况下运行。通过对逻辑稍加处理,我得出结论:是.append(\“span\”)导致了异常


我有点困了,所以我希望有人能给我一个正确的方向。

我已经解决了问题

1) parser.Parse返回的文档(source);不实现d3使用的函数CreateElements。我通过使用代理调用的包装器解决了这个问题

2) d3使用了我没有设置的变量ownerDocument。因此,我还必须添加以下内容

jintEngine.SetValue("ownerDocument", new MyDocumentWrapper(document));
请注意,这并不能使整个d3库正常工作。我还注意到d3.geopath()存在一些问题,但通过这些修复,我能够执行我的初始示例

        jintEngine = jintEngine.Execute("function testFunc() { d3.select(\"body\"); return 42;}");
jintEngine.SetValue("ownerDocument", new MyDocumentWrapper(document));