Pergunta

Então, eu estou usando o MSScriptControl para executar algumas javascript no meu app e eu quero ser capaz de obter algumas informações sobre quaisquer erros que o script pode causar.

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

O código funciona bem na minha máquina de desenvolvimento do Windows 7, caixa, e me dá o número de uma linha com um erro.Assim, tive a felicidade de publicar e empurre-o para a máquina de produção, que sempre me diz que o erro ocorreu na linha 0 e nenhuma descrição é fornecida.

Eu tentei ir para http://www.microsoft.com/download/en/details.aspx?id=1949 para baixar a versão mais recente, mas a instalação não teve nenhum efeito.Eu também definir a propriedade de incorporação de Interoperabilidade Tipos de falsificação, bem como a cópia de minha própria msscript.arquivo ocx para o Windows 2008 server directório system32, mas nenhuma dessas tentativas resolvido nada.

Alguém tem alguma recomendação?

Foi útil?

Solução

Quanto ao problema que você enfrenta apenas alguns pensamentos:

  • de acordo com o link que você forneceu esse controle não suporta o Windows 7 ou o Windows 2008
  • pode ser um problema de segurança com relação ao COM/UAC etc.
  • pode ser um problema por causa do número de bits se você compilado para AnyCPU, tente usar o x86

Em relação a possíveis alternativas:

Outras dicas

Se você quiser fazê-lo em todos os nativos do c#, sem qualquer parte 3 ou "componente" de dependências externas usar um CodeDomProvider com uma pequena JScript bootstrap, como este:

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

que cria um JsEval(string) o método que você pode usar em qualquer lugar no seu código para "eval" uma seqüência de caracteres como JavaScript (bem JScript)...Por isso, chamar:

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

dependendo do seu uso, você não pode querer para instanciar esses membros estaticamente.se você deseja manipular objetos complexos, você precisa criar um wrapper para reflexivo extrair dados (ou você poderia conjurar como apropriado JScript contrapartida, mas eu nunca tentei isso, como você teria que incluir o JScript conjuntos).

aqui está um exemplo de uma classe de wrapper que faz tudo o JavaScript vai deixar você fazer nativamente, a adição de mais alto nível de funcionalidade provavelmente seria complicado o suficiente para que você seria melhor fora de qualquer extraindo os membros em um dicionário / tabela de hash OU, alternativamente, a serialização e desserialização na outra extremidade

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

você pode ver isso em ação fazendo isso:

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

eu, pessoalmente, tenho usado um código semelhante a este grande efeito em um ponto ou outro e pode garantir a sua disponibilidade e capacidade de operação dentro de um ambiente de servidor..Espero que isso ajude-ck

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top