Incorporando o mecanismo JavaScript ao .NET

apenas imaginando se alguém já tentou incorporar e realmente integrar qualquer mecanismo js ao ambiente .net. Eu poderia encontrar e realmente usar (depois de muita dor e esforço, já que é bastante desatualizado e não terminou) projeto spidermonkey-dotnet. Alguém com experiência nesta área? Motores como SquirrelFish, V8 ..

Não que eu não esteja satisfeito com o Spidermonkey da Mozilla (usando-o para miniframework do tipo Rails para componentes customizados dentro do núcleo do aplicativo ASP.NET), mas eu ainda adoraria explorar um pouco mais com as opções. As soluções de linha de comando não são o que eu preciso, não posso confiar em nada além do CLR, preciso chamar methods de / para objects JavaScript / C #.

// c# class public class A { public string Hello(string msg) { return msg + " whatewer"; } } // js snippet var a = new A(); console.log(a.Hello('Call me')); // i have a console.log implemented, don't worry, it's not a client-side code :) 

Só para esclarecer – eu não estou tentando realmente programar o aplicativo em si no javascript do lado do servidor. É usado apenas para escrever sub-aplicativos de usuário personalizados (pode ser visto como algum tipo de DSL). É muito mais fácil (e seguro) permitir que pessoas normais programem em js que C #.

Tente Javascript . Está hospedado no GitHub Ele foi originalmente hospedado no CodePlex, aqui )

Discussões do projeto: http://javascriptdotnet.codeplex.com/discussions

Implementa o Google V8. Você pode compilar e executar JavaScript diretamente a partir do código .NET e fornecer objects CLI para serem usados ​​também pelo código JavaScript. Ele gera código nativo do JavaScript.

O intérprete JavaScript de código aberto Jint ( http://jint.codeplex.com ) faz exatamente o que você está procurando.

Editar:
O projeto foi totalmente reescrito e agora está hospedado no Github em https://github.com/sebastienros/jint

Você também pode estar interessado no Microsoft ClearScript, que está hospedado no GitHub e publicado sob a licença Ms-Pl.

Eu não sou fanboy da Microsoft, mas devo admitir que o suporte V8 tem as mesmas funcionalidades do Javascript.Net, e mais importante, o projeto ainda é mantido. Tanto quanto eu estou preocupado, o suporte para os delegates também funciona melhor do que com Spidermonkey-dotnet.

ps: Ele também suporta JScript e VBScript, mas não estávamos interessados ​​por este material antigo.

ps: É compatível com o .NET 4.0 e 4.5+

Alguém apenas sintonizando o check-out do Jurassic também:

http://jurassic.codeplex.com/

edit: isso mudou para o github (e parece ativo à primeira vista)

https://github.com/paulbartrum/jurassic

Você pode tentar ironJS, parece promissor, embora esteja em desenvolvimento pesado. https://github.com/fholm/IronJS

Eu acho que ainda não estou claro sobre o que você está tentando fazer, mas JScript.NET pode valer a pena investigar, embora Managed JScript parece que pode ser mais apropriado para suas necessidades (é mais como JavaScript que JScript.NET) .

Pessoalmente, achei que seria legal integrar o V8 de alguma forma, mas não consegui baixar o código-fonte; Gostaria de ter tempo para realmente fazer algo com isso.

Se a linguagem não for um problema (qualquer script baseado em sandbox), haverá LUA para .NET . A versão do Silverlight do .NET framework também é afaik em sandbox.

Você pode usar o mecanismo Chakra em C #. Aqui está um artigo no msdn mostrando como:

http://code.msdn.microsoft.com/windowsdesktop/JavaScript-Runtime-Hosting-d3a13880

Ei, dê uma olhada para o Javascript .NET no codeplex ( http://javascriptdotnet.codeplex.com/ ) com a versão 0.3.1, há alguns novos resources bastante interessantes que provavelmente lhe interessam.

Confira um exemplo de código:

 // Initialize the context JavascriptContext context = new JavascriptContext(); // Setting the externals parameters of the context context.SetParameter("console", new SystemConsole()); context.SetParameter("message", "Hello World !"); context.SetParameter("number", 1); // Running the script context.Run("var i; for (i = 0; i < 5; i++) console.Print(message + ' (' + i + ')'); number += i;"); // Getting a parameter Console.WriteLine("number: " + context.GetParameter("number")); 

Script # compila C # para js e é o filho do cérebro de uma das equipes do ASP.Net. Rick Strahl também tem alguns posts sobre incorporação de js como mecanismo de tempo de execução para avaliação de expressão.

Eu tentei o Script RemObjects para .Net .

Ele funciona, embora eu tenha que usar uma fábrica estática ( var a=A.createA(); ) do JavaScript em vez da syntax var a=new A() . (A function ExposeType só expõe a estática!) Não há muita documentação e a fonte é escrita com o Delphi Prism, o que é bastante incomum para mim e para o RedGate Reflector.

Então: Fácil de usar e configurar, mas não ajuda muito em cenários avançados.

Também ter que instalar algo em vez de simplesmente soltar as montagens em um diretório é negativo para mim …

Eu criei uma solução muito mais simples.

Eu construí um arquivo .dll usando JavaScript e, em seguida, compilado usando o compilador de JavaScript que está disponível em um prompt de comando do desenvolvedor VS2013.

Uma vez que temos o .dll , basta adicioná-lo à pasta \Support e, em seguida, referenciá-lo no projeto que precisava para avaliar as instruções JavaScript.

Etapas detalhadas para criar um .dll :

  1. Crie um arquivo no Bloco de Notas apenas com estes conteúdos:

     class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Salve o arquivo como C:\MyEval.js

  3. Abra um Prompt de Comando do VS2005 (Iniciar, Programas, VS2005, Ferramentas do VS2005)

  4. Digite Cd\ para ir para C:\

  5. Tipo

     jsc /t:library C:\MyEval.js 
  6. Um novo arquivo é criado chamado MyEval.dll .

  7. Copie MyEval.dll para o projeto e referência-lo (também referência Microsoft.Jscript.dll ).

  8. Então você deve poder chamá-lo assim:

     Dim jScriptEvaluator As New EvalClass Dim objResult As Object objResult = jScriptEvaluator.Evaluate(“1==1 && 2==2”) 

objResult é True .

A maneira documentada da Microsoft de adicionar extensibilidade de scripts a qualquer coisa é IActiveScript. Você pode usar o IActiveScript de qualquer aplicativo .NET para chamar a lógica do script. A lógica pode se divertir em objects .NET que você colocou no contexto de script.

Essa resposta fornece um aplicativo que faz isso, com código:

  • O mecanismo do Chakra JScript do IE10 estará disponível como autônomo acessível a partir do C #?

Há uma implementação de um host do mecanismo de script ActiveX em C # disponível aqui: analisar e executar JS por c #

Ele permite o uso de Javascript (ou VBScript) diretamente do C #, em processos nativos de 32 ou 64 bits. A fonte completa é ~ 500 linhas de código C #. Ele tem apenas uma dependência implícita no mecanismo JScript instalado (ou VBScript).

Por exemplo, o código a seguir:

 Console.WriteLine(ScriptEngine.Eval("jscript", "1+2/3")); 

irá exibir 1.66666666666667

Há também o MsieJavaScriptEngine, que usa o mecanismo do Internet Explorer Chakra.

Eu sei que estou abrindo um thread antigo, mas eu trabalhei muito no smnet (spidermonkey-dotnet). Nos últimos anos. Seu principal foco de desenvolvimento tem sido a integração perfeita de objects .net no mecanismo do spidermonkey. Ele suporta uma ampla variedade de conversões de valores js para objects .net. Alguns desses incluindo delegates e events.

Basta dizer que vale a pena verificar agora que há algum desenvolvimento constante nele :). Mantenho o repo do SVN atualizado com correções de bugs e novos resources. Os arquivos de soluções de origem e projeto são configurados para serem construídos com êxito no download. Se houver algum problema, sinta-se à vontade para abrir uma discussão.

Eu entendo o desejo de ter uma solução de javascript gerenciada, mas de todos os javascript gerenciados que usei, todos eles são muito carentes de alguns resources importantes que ajudam a torná-los robustos e fáceis de trabalhar. Eu mesmo estou esperando no IronJS para amadurecer um pouco. Enquanto espero, me divirto brincando com spidermonkey-dotnet =)

projeto spidermonkey-dotnet e página de download

Edit: criou a página wiki da documentação esta tarde.

Experimente o ReoScript , um interpretador JavaScript de código aberto implementado em C #.

O ReoScript faz com que seu aplicativo possa executar o JavaScript. Possui uma ampla variedade de methods de extensão, como SetVariable, Function Extension, usando CLR Type, .Net Event Binding e etc.

Olá Mundo:

 ScriptRunningMachine srm = new ScriptRunningMachine(); srm.Run(" alert('hello world!'); "); 

E aqui está um exemplo de script que cria uma winform e a mostra.

 import System.Windows.Forms.*; // import namespace var f = new Form(); // create form f.click = function() { f.close(); }; // close when user clicked on form f.show(); // show 

Acredito que todos os principais mecanismos JS de opensource (JavaScriptCore, SpiderMonkey, V8 e KJS) fornecem APIs de incorporação. O único com o qual estou realmente familiarizado é o JavaScriptCore (que é o nome do mecanismo de JS do qual o SquirrelFish vive) que fornece uma API C pura. Se a memory servir (já faz um tempo que eu usei o .NET), o .NET tem um suporte razoavelmente bom para vincular as APIs do C.

Eu sinceramente não sei como são as APIs para os outros mecanismos, mas sei que todas elas são fornecidas.

Dito isso, dependendo dos seus propósitos, o JScript.NET pode ser melhor, já que todos esses outros mecanismos exigirão que você os inclua no aplicativo, já que o JSC é o único que realmente vem com um sistema operacional, mas esse sistema operacional é MacOS: D

Use o JSCRIPT.NET para obter uma biblioteca (dll) do js. Em seguida, faça referência a essa dll em seu aplicativo .NET e você está lá. FEITO!

V8.NET é um novo garoto no bloco (em abril de 2013) que envolve mais de perto a funcionalidade do mecanismo V8 nativo. Isso permite mais controle sobre a implementação.

Você pode usar o Rhino um mecanismo Javascript do Mozilla escrito em Java, e usá-lo com o IKVM, aqui estão algumas instruções

Instruções: https://www.codeproject.com/Articles/41792/Embedding-JavaScript-into-C-with-Rhino-and-IKVM

É possível agora com o ASP.Net MVC4 Razor View. o código será este:

 // c# class public class A { public string Hello(string msg) { return msg + " whatewer"; } } // js snippet  

e o Razor não é apenas para MVC4 ou outros aplicativos da Web e você pode usá-lo em aplicativos de área de trabalho offline.