Question

J'utilise donc MSScriptControl pour exécuter du javascript dans mon application et je souhaite pouvoir obtenir des informations sur les erreurs que le script peut provoquer.

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);
}

Le code fonctionne bien sur ma machine de développement, une machine Windows 7, et me donne un numéro de ligne avec une erreur.Je le publie donc avec plaisir et le transmets à la machine de production qui m'indique toujours que l'erreur s'est produite à la ligne 0 et qu'aucune description n'est fournie.

J'ai essayé d'aller http://www.microsoft.com/download/en/details.aspx?id=1949 pour télécharger la dernière version mais son installation n'a eu aucun effet.J'ai également défini la propriété Embed Interop Types sur false et copié mon propre fichier msscript.ocx dans le répertoire system32 du serveur Windows 2008, mais aucune de ces tentatives n'a résolu quoi que ce soit.

Quelqu'un a des recommandations ?

Était-ce utile?

La solution

Concernant le problème que vous êtes confronté à quelques réflexions:

  • Selon le lien que vous avez fourni à ce contrôle ne prend en charge Windows 7 ni Windows 2008
  • Cela pourrait être un problème de sécurité en ce qui concerne COM / UAC, etc.
  • Cela pourrait être un problème en raison de l'hypothèse si vous compilez pour AnyCPU, essayez d'utiliser X86

concernant les alternatives possibles:

Autres conseils

Si vous souhaitez le faire dans tout C# natif sans aucune dépendance externe tierce ou "composant", utilisez un CodeDomProvider avec un petit bootstrap JScript, comme ceci :

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;
    }
}

qui crée un JsEval(string) méthode que vous pouvez utiliser n'importe où dans votre code pour "évaluer" une chaîne en JavaScript (enfin JScript)...Alors j'appelle :

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

en fonction de votre utilisation, vous ne souhaiterez peut-être pas instancier ces membres de manière statique.si vous souhaitez manipuler des objets complexes, vous devrez créer un wrapper pour extraire les données de manière réfléchie (ou vous pouvez les convertir en homologue JScript approprié, mais je n'ai jamais essayé cela car vous devrez inclure les assemblys JScript).

voici un exemple de classe wrapper qui fait tout ce que JavaScript vous permet de faire de manière native, l'ajout de fonctionnalités de haut niveau serait probablement suffisamment lourd pour que vous feriez mieux soit d'extraire les membres dans un dictionnaire/table de hachage OU alternativement de sérialiser et désérialisation à l'autre bout

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);
    }
}

vous pouvez voir cela en action en faisant ceci :

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"
}

J'ai personnellement utilisé un code similaire à celui-ci avec beaucoup d'effet à un moment ou à un autre et je peux garantir sa disponibilité et son exécution dans un environnement de serveur.J'espère que cela aide -ck

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top