Pergunta

Estou construindo uma aplicação .NET 3.5 e tem a necessidade de avaliar o código JS no servidor - basicamente um usuário fornecido conjunto de regras que pode trabalhar dentro de um navegador ou no servidor. Managed JS não é uma opção, porque o código JS seria fornecido em tempo de execução. Jaxer do Aptana também não é uma opção. Então, eu estava olhando para usar uma compilação do motor V8 dentro do meu aplicativo.

Eu construí a fonte com sucesso em uma DLL, mas que DLL não, não é uma biblioteca gerenciada e não é COM quer. V8 é simplesmente C ++.

Todas as ideias sobre a forma como a interoperabilidade com este tipo de DLL em C #? Além disso, estou aberto a outras sugestões para SpiderMonkey ou outro motor de JS.

Agradecemos antecipadamente.

UPDATE:

Eu era capaz de usar a solução de Ryan. I acaba de atualizar as referências para o construir para o mais tardar a partir do tronco. Ele trabalhou muito. Graças Ryan.

Foi útil?

Solução

Eu percebo que isso pode não ser uma resposta exata para sua pergunta, mas eu percebi que eu iria colocar meu valor de 2 centavos em como eu duvido que muitas pessoas têm tentado isso.

Eu tenho que trabalhar por criado um gerenciado wrapper utilizando o modo misto C ++. Há outras maneiras de fazer isso, mas eu estava indo para tentar fazer um envoltório completo que pode ser usado de qualquer linguagem .NET.

Obtendo o lib para compilar em tal maneira a que pudesse ser incluído em um projeto de modo misto foi um pouco de um desafio. Eu tive que modificar a biblioteca de tempo de execução (no arquivo SConstruct) usado para / MD e / MDd para que ele seja compatível com a opção / clr.

Até agora, tenho apenas scripts simples correndo retornos de chamada como eu não tenham implementado, métodos personalizados, objetos e tal.

Aqui está uma amostra rápida do que a aparência de uso, como para um dos meus aplicativos de teste:

V8DotNet.Shell shell = new V8DotNet.Shell();

shell.ExecuteScript(@"print('V8 version is: ' + version());");

Ele executa scripts mais complicadas, como uma multa codificador base64 também. Mas por agora eu só pode adicionar itens personalizados do c ++ lado.

Estou disposto a fornecer mais informações + código se alguém estiver interessado, como eu não pode sempre escolher este projeto de volta para cima. Mas, eu tenho medo é forma de muito código para entrar em um post aqui por isso, teria de encontrar algum outro meio como o Google Code ou CodePlex.

Editar:


OK, eu tenho carregado o código. Eu tenho que colocar um aviso sobre isso: O projeto é muito cedo e eu sou um amador em C ++ na melhor das hipóteses, então não tenha muitas esperanças demais. Além disso, este projeto foi criado / feito logo após o Chrome foi lançado assim que a versão do v8 incluído pode ser velho.

Dito isto, aqui está: http://ryanscook.com/Files/V8- DotNet.zip (21,5 MB)

No pacote você encontrará os seguintes itens de interesse:

V8Net-Library \ V8.Net \ V8.Net.sln - Este é a solução que tem o conseguiu C ++ proj invólucro e um console aplicativo C # para testar.

Dependências \ V8 - Este é meu código V8 que eu usei para construir o lib V8.

Espero que ajude!

Outras dicas

Você pode tentar Javascript NET:

http://javascriptdotnet.codeplex.com/

Ele permite que você criar um contexto V8 de .NET e registrar CLI objetos nele para que possa manipulá-los e membros de chamadas a partir do código Javascript. Ele compila o Javascript em tempo de execução.

Confira.

Confira v8sharp . Ele suporta execução JS no interior de uma aplicação .NET. Ele também permite que você registre tipos .NET com o motor V8 para que seu código JS pode interagir com o seu código .NET. Eu estou no processo de adição de suporte para ligar a função / suporte delegado.

são edifício uma verdadeira javascript - não "JScript" - tempo de execução (junto com IronPython, IronRuby, e VB10) sobre o CLR usando o DLR, mas não consigo encontrar nenhum download ou conteúdo para ele. Talvez isso vai chegar com C # 4?

Segundo o que ouvi a compilá-lo com IJW (Managed C ++) deve apenas trabalho -. Mas posso estar muito errado, eu nunca toque MC ++

Eu acho que gatapia substituiu js.net com Jish

Necromancing.
Como por 2018 e .NET Núcleo 2.0+
você pode usar vroomjs-core

Executar alguns Javascript:

using (var engine = new JsEngine())
{
    using (var context = engine.CreateContext())
    {
        var x = (double)context.Execute("3.14159+2.71828");
        Console.WriteLine(x);  // prints 5.85987
    }
}

Criar e retornar um objeto Javascript, em seguida, chamar um método em que:

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        // Create a global variable on the JS side.
        context.Execute("var x = {'answer':42, 'tellme':function (x) { return x+' '+this.answer; }}");
        // Get it and use "dynamic" to tell the compiler to use runtime binding.
        dynamic x = context.GetVariable("x");
        // Call the method and print the result. This will print:
        // "What is the answer to ...? 42"
        Console.WriteLine(x.tellme("What is the answer to ...?"));
    }
}

propriedades de acesso e métodos de compra sobre CLR objetos de Javascript:

class Test
{
    public int Value { get; set; }
    public void PrintValue(string msg)
    {
        Console.WriteLine(msg+" "+Value);
    }
}

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        context.SetVariable("m", new Test());
        // Sets the property from Javascript.
        context.Execute("m.Value = 42");
        // Call a method on the CLR object from Javascript. This prints:
        // "And the answer is (again!): 42"
        context.Execute("m.PrintValue('And the answer is (again!):')");
    }
}

Você pode tentar V8.NET também.

https://www.nuget.org/packages/V8.Net/

Ele permite que você facilmente integrar código com V8 em um nível inferior do que muitos outros invólucros. Ele também suporta .Net 4.6.1+ e .Net Padrão 2.0+ (.Net Core).

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