Domanda

Quindi sto usando MsScriptControl per eseguire alcuni JavaScript nella mia app e voglio essere in grado di ottenere alcune informazioni su eventuali errori che lo script potrebbe causare.

MSScriptControl.ScriptControlClass script = new MSScriptControl.ScriptControlClass();
try
{
    script.Language = "JScript";
    script.Timeout = 15000;
    script.Eval(Code);
}
catch (Exception ex)
{
    MSScriptControl.Error err = script.Error;
    ret = new Exception("Error on line: " + err.Line + ", Description: " + err.Description);
}
.

Il codice funziona bene sulla mia macchina di sviluppo, una casella di Windows 7 e mi dà un numero di linea con un errore.Così ho felicemente pubblicato e spingerlo alla macchina di produzione che mi dice sempre che l'errore si è verificato alla linea 0 e nessuna descrizione è fornita.

Ho provato ad andare a http://www.microsoft.com/Scarica / it / Details.aspx? ID= 1949 Per scaricare la versione più recente ma installare non ha alcun effetto.Ho anche impostato la proprietà incorpora i tipi di interopera incorporati su false e copiando il mio file msscript.ocx nella directory System32 di Windows 2008 Server, ma nessuno di questi tentativi risolveva nulla.

Qualcuno ha qualche raccomandazione?

È stato utile?

Soluzione

Per quanto riguarda il problema che affronti solo alcuni pensieri:

    .
  • Secondo il link che hai fornito questo controllo, non supporta Windows 7 né Windows 2008
  • Potrebbe essere un problema di sicurezza per quanto riguarda com / uc ecc.
  • Potrebbe essere un problema a causa della bittà se hai compilato per AnyCPU, prova a utilizzare x86

Per quanto riguarda possibili alternative:

Altri suggerimenti

Se si desidera eseguirlo in tutto il c # nativo senza alcuna terza parte o "componente" dipendenze esterne utilizzano un CodeDomProvider con un piccolo jscript bootstrap, come questo:

private static readonly MethodInfo eval = CodeDomProvider
        .CreateProvider("JScript")
        .CompileAssemblyFromSource(new CompilerParameters(), "package e{class v{public static function e(e:String):Object{return eval(e);}}}")
        .CompiledAssembly
        .GetType("e.v")
        .GetMethod("e");

private static object JsEval(string jscript)
{
    try
    {
        return eval.Invoke(null, new[] { jscript });
    }
    catch (Exception ex)
    {
        return ex;
    }
}
.

che crea un metodo JsEval(string) che è possibile utilizzare ovunque nel tuo codice su "Eval" una stringa come JavaScript (Bene JScript) ... Quindi chiamando:

MessageBox.Show("" + JsEval("2 + 2")); // 4
MessageBox.Show("" + JsEval("(function(){ return 3+7; })();")); // 10
MessageBox.Show("" + JsEval("function yay(a) { return a + 1; } yay(2);")); // 3
.

A seconda del tuo utilizzo che potresti non voler istanziare questi membri staticamente. Se si desidera manipolare oggetti complessi, dovrai creare un wrapper per estrarre riflessivamente i dati (oppure potresti lanciare come appropriato controparte JScript, ma non l'ho mai provato come dovresti includere gli assiemi JScript).

Ecco un esempio di una classe wrapper che tutto ciò che JavaScript ti permetterà di fare in modo nativo, aggiungendo più funzionalità di alto livello sarebbe probabilmente ingombrante in modo che sia meglio estrarre i membri in un dizionario / tavola di hash o In alternativa serializzazione e deserializzazione sull'altra estremità

private class JsObjectWrapper : IEnumerable
{
    public readonly object jsObject;
    private static PropertyInfo itemAccessor = null;
    private static MethodInfo getEnumerator = null;

    public JsObjectWrapper(object jsObject)
    {
        this.jsObject = jsObject;

        if (itemAccessor == null) 
        {
            itemAccessor = jsObject.GetType().GetProperty("Item", new Type[] { typeof(string) });
        }

        if (getEnumerator == null)
        {
            getEnumerator = jsObject.GetType().GetInterface("IEnumerable").GetMethod("GetEnumerator");
        }
    }

    public object this[string key]
    {
        get { return itemAccessor.GetValue(jsObject, new object[] { key }); }
        set { itemAccessor.SetValue(jsObject, value, new object[] { key }); } 
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return (IEnumerator)getEnumerator.Invoke(jsObject, null);
    }
}
.

Puoi vedere questo in azione facendo questo:

var jsObj = JsEval("var x = { a:7, b:9 };");
var csObj = new JsObjectWrapper(jsObj);

MessageBox.Show("a: " + csObj["a"]);  // a: 7
MessageBox.Show("b: " + csObj["b"]);  // b: 9

csObj["yay!"] = 69;

foreach (string key in csObj)
{
    MessageBox.Show("" + key + ": " + csObj[key]); // "key": "value"
}
.

Ho usato personalmente il codice simile a questo a un grande effetto a un punto o nell'altro e può garantire la sua disponibilità e la runnability all'interno di un ambiente server .. Spero che questo aiuti -ck -ck

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top