2012-12-03 57 views
4

我想使用DLR從c#執行JavaScript代碼。C#4中的DLR和Javascript解釋?

所以我寫了使用c#Jint一個簡單的代碼:

var script = @" 
           function show() 
           { 
             return parseInt('123asd'); //in js it's 123 
           }; 
           return show();"; 

       var result = new JintEngine().Run(script); 
       Console.WriteLine(result); 

parseInt('123asd')在JavaScript是:123

但結果我得到的是:

enter image description here

  • 也許我看不到整個圖片,但是如果世界另一端的程序員發給我他的腳本文件,我(和他)會期望結果一致!

  • 如果我錯了,在什麼情況下我會使用在.Net上運行其他代碼? (我將不得不非常非常可疑每一行代碼 ...)

+1

或者它可能只是Jint中的一個錯誤? http://jint.codeplex.com/SourceControl/changeset/view/22024d8a6e7a#Jint%2fNative%2fJsGlobal.cs根據javascript規範,它應該返回123而不是NaN http://www.ecma-international.org/ecma -262/5.1/Ecma-262.pdf –

+0

@MarekKembrowski我可以提供1000個以上的例子,這會產生不穩定的結果。 –

+0

所以也許查克拉(IE9引擎和IActiveScript)將爲你工作? http://stackoverflow.com/questions/5939002/will-the-ie10-chakra-jscript-engine-available-as-stand-alone-accessible-from-c –

回答

4

這似乎是Jint的partseInt功能的當前行爲。

相關代碼:

// most common case 
double result; 
if(double.TryParse(number,NumberStyles.Any, CultureInfo.InvariantCulture, out result)) { 
    // parseInt(12.42) == 42 
    return NumberClass.New(sign * Math.Floor(result)); 
} 
else { 
    return this["NaN"]; 
} 

.NET的double.TryParse不會解析'123asd'123,但返回它不能解析整個字符串。

你應該在Jint中填寫bug報告。 E:這是「標準」的問題。你永遠無法在所有實現中100%兼容標準。總會有分歧。只要看看IE瀏覽器與Chrome瀏覽器與Firefox與Opera。所有這些使用不同的JavaScript引擎,所以你可以預期的差異。如果你真的想要交叉兼容,你應該按照標準來實現,並將所有非標準行爲視爲實現中的錯誤。如果您嘗試解決此錯誤或報告並希望它得到修復,則由您決定。

+0

我敢肯定,如果我使用另一個Javascript解釋器,我會發現其他的不匹配。我可以重複我的問題:_可能我沒有看到整個圖片,但是如果世界另一端的程序員發給我他的腳本文件,我(和他)期望的結果是一致的!_ –

+0

@RoyiNamir看到我的編輯 – Euphoric

+0

我的問題是更抽象然後這個糟糕的JINT。我怎樣才能相信一個不同的代碼(這是由DLR支持的)行爲與我的C#完全一樣? (例如:somone可以在JS中編寫一個完整的算法,並且(你必須同意)它必須產生100%相同的結果 - 就像我自己用c#寫的那樣)。 –

3

如果您正在尋找如何在.NET中執行javascript以及如何在Windows程序(如Internet Explorer)中執行的1:1匹配,則可以使用Windows腳本引擎(不僅是在這裏描述的SO的Jscript也VBScript或任何其他ActiveX Scripting語言):parse and execute JS by C#

這是怎麼了你的代碼可以使用這種技術來實現:

 var script = @" 
          function show() 
          { 
            return parseInt('123asd'); //in js it's 123 
          }"; // Note I have removed the return as it's not needed here 

     using (ScriptEngine engine = new ScriptEngine("jscript")) 
     { 
      ParsedScript parsed = engine.Parse(script); 
      Console.WriteLine(parsed.CallMethod("show")); 
     } 
    } 

這將作爲預期的輸出123。注意我認爲原始代碼可以使用新的dynamic C#關鍵字進行改進,所以我們可以直接編寫Console.WriteLine(parsed.show())

+0

西蒙,有JS改變了這樣的方式,現在,通過C#,我可以做'parsed.show()'?我的意思是,他們做了什麼使這個電話工作?他們不得不改變一些東西.... –

+0

是的,'dynamic'關鍵字意味着你可以調用它的任何方法/屬性,它將在運行時解析,而不是在編譯時(所以你可以基本輸入任何東西並編譯) 。創建'動態'的原因之一是具體的COM互操作(這是怎麼樣我的示例)。 –

+1

我知道C#有什麼動態的意思。但他們不得不以這種方式暴露JS im,以便我可以通過動態調用func .... –