簡體   English   中英

使用jint從C#使用d3調用javascript

[英]using jint to call javascript using d3 from c#

我目前正在一個項目中,我們需要根據一些輸入數據生成一些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(“ testFunc”)。ToObject(); 引發異常。

異常截圖

如果我嘗試更換線

        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(\\“ span \\”)。

我有點被困住了,所以我希望有人可能有一個想法,可以指出正確的方向。

我已經解決了問題。

1)由parser.Parse(source)返回的文檔; 沒有實現d3使用的createElementNS函數。 我通過使用委派調用的包裝器解決了此問題。

2)d3使用我沒有設置的變量ownerDocument。 所以我還必須添加以下內容

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

注意,這不能使整個d3庫正常工作。 我也注意到d3.geopath()有一些問題,但是有了這些修復,我可以執行我的第一個示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM