[英]How to obtain a proper C# string array from a JavaScript function call using Jint
[英]using jint to call javascript using d3 from c#
我目前正在一個項目中,我們需要根據一些輸入數據生成一些SVG。 目前,所有此類SVG生成都是使用d3庫在javascript中實現的。 請注意,我的目標是能夠重用此邏輯而不是全部實現。
我的問題是我希望能夠從C#調用此javascript。
我嘗試使用PhantomJS,並且能夠生成SVG,但我不滿意,因為
因為我對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.