2015-01-08 47 views
2

我有這個javasccript表達式代碼作爲我的C#代碼中的字符串,我需要使用Microsoft.JScript.Eval.JScriptEvaluate(c#)評估它(執行它)並獲取結果。Еxception從C#執行JS代碼#

string code = @"var roles=[]; 
roles.push('LOC_IND'); 
roles.push('MANAGERL3'); 
var country='CANADA'; 
var age=80; 
eval(""roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA'"")"; 

// Calling JScript.Eval to execute that code 
var engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
var result = Microsoft.JScript.Eval.JScriptEvaluate(code, engine); 

的JavaScript代碼本身工作正常,如果你在瀏覽器控制檯執行它,然後返回 「真」,符合市場預期:但是

var roles=[]; 
roles.push('LOC_IND'); 
roles.push('MANAGERL3'); 
var country='CANADA'; 
var age=80; 
eval("roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA'") 

,當我把它從C#評估和演示。 JScriptEvaluate(代碼,引擎);我得到這個例外:

預期功能。

我不知道它期望什麼功能,我該怎麼做才能解決這個問題? 最後Eval.JScriptEvaluate(代碼,引擎)必須返回true。

謝謝

+0

該代碼應該做什麼?爲什麼它使用'eval()'? – Pointy

+0

很明顯,它必須評估表達式,在瀏覽器控制檯中運行它,你會看到。 – monstro

+0

它與'eval()'一起工作,但它也完全相同*沒有*'eval()'。 – Pointy

回答

1

感謝很多狗:)

我發現了一個更簡單的方法,使用第三方庫 - Jint。

這個位置是正確的:https://github.com/sebastienros/jint

string code = @"var roles=[]; 
roles.push('LOC_IND'); 
roles.push('MANAGERL3'); 
var country='CANADA'; 
var age=80; 
function foo(){return roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA';}"; 

// Using Jint - Javascript Interpreter for .NET 

var result = new Jint.Engine().Execute(code).Invoke("foo"); 

附:另一種選擇是使用自調用功能,但是要獲得返回布爾結果則更困難:

string code = @"var roles=[]; 
roles.push('LOC_IND'); 
roles.push('MANAGERL3'); 
var country='CANADA'; 
var age=80; 
(function(){return roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA';})();"; 

var result = new Jint.Engine() 
    .Execute(code) 
    .Boolean 
    .PrototypeObject 
    .PrimitiveValue 
    .AsBoolean(); 
1

首先,你不需要調用eval。
其次,您應該將自己的代碼封裝在一個自調用函數中,因爲您期待得到一個結果。
第三,看起來像Microsoft JScript不支持JavaScript的Array.prototype的部分或全部方法,因此您不能使用indexOf()。 試試這個代碼:

string code = @" 
function hasRole(roles,role){ 
    for(var i=0;i<roles.length;i++) 
     if(roles[i]==role)return true; 
    return false; 
}; 
(function(){ 
    var roles=[],country='CANADA',age=80; 
    roles.push('LOC_IND'); 
    roles.push('MANAGERL3'); 
    return hasRole(roles,'Administrator')||hasRole(roles,'LOC_IND')&&country=='CANADA'; 
})();"; 


在一個側面說明,它看起來像你缺少你return語句一對括號。