Incorporando o mecanismo JavaScript no .NET [fechado]

216

apenas imaginando se alguém já tentou incorporar e realmente integrar algum mecanismo js ao ambiente .net. Eu poderia encontrar e realmente usar (depois de muita dor e esforço, já que está bastante desatualizado e ainda não terminou) o 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 semelhante ao Rails para componentes personalizados dentro do aplicativo ASP.NET principal), mas eu ainda adoraria explorar um pouco mais as opções. As soluções de linha de comando não são o que eu precisaria, não posso confiar em nada além de CLR, preciso chamar métodos de / para objetos 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 :)

Apenas para esclarecer - não estou tentando programar o aplicativo em javascript do servidor. É usado apenas para escrever subaplicativos 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 do que em c #.

aprilchild
fonte

Respostas:

98

Experimente o Javascript .NET . Está hospedado no GitHub Foi originalmente hospedado no CodePlex, aqui )

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

Ele implementa o Google V8. É possível compilar e executar o JavaScript diretamente do código .NET, além de fornecer objetos CLI para serem usados ​​pelo código JavaScript. Ele gera código nativo do JavaScript.

Michel Boissé
fonte
+1. É simples e parece funcionar muito bem.
JC Inácio
6
Há alegações de que isso está morto nos fóruns de discussão do projeto, a documentação além de um exemplo básico é ruim e estou lutando para adicionar um manipulador de eventos JavaScript a um evento .Net com ele em um script.
27711 Alan Macdonald
6
Noesis (empresa original de desenvolvimento) perdeu o interesse no projeto, mas acabou decidindo dar o controle à comunidade. Consequentemente, existe agora uma nova versão que inclui muitas correções de bugs. Infelizmente, os retornos de chamada JavaScript de .Net ainda não são suportados.
Oliver Bock
Outra observação para o futuro: parece que o pacote Nuget está funcionando de alguma forma ... atualmente não "apenas funciona" quando você instala o pacote.
22614 Chris Pfohl
3
Como o javascriptdotnet está morto, considere usar o ClearScript (consulte esta resposta )
JB. Com a Monica.
86

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

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

Sébastien Ros - MSFT
fonte
6
Outra possibilidade criada sobre o DLR: RemObjects Script for .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild
Eu acho que está escrito em Delphi Prism / Oxygen, e fornecido como código-fonte; portanto, se você não comprou uma licença para os produtos acima mencionados, não é tão útil. Estou errado? Se houver uma versão em forma binária em qualquer lugar, eu gostaria de experimentá-la.
Andrew Savinykh
2
O RemObjects Script está escrito em Oxygene, correto, mas você realmente não precisa de uma licença da Oxygene para usá-lo - por um lado, você pode obter o instalador binário em remobjects.com/free , por outro, você pode até obter o compilador de linha de comando Oxygene gratuito, se você precisou reconstruir você mesmo, a partir da fonte. Um dos grandes benefícios da plataforma .NEt é a independência do idioma, afinal. não importa em que idioma a biblioteca está escrita, para você usá-la.
Marc Hoffman
1
Última versão em 2011 ... Jurassic parece melhor.
Roman Starkov 03/02
3
Última versão de 2014, na verdade: github.com/sebastienros/jint
Sébastien Ros - MSFT
54

Talvez você também esteja interessado no Microsoft ClearScript, hospedado no GitHub e publicado sob a licença Ms-Pl.

Não sou fanboy da Microsoft, mas devo admitir que o suporte à V8 possui as mesmas funcionalidades que o Javascript.Net e, mais importante, o projeto ainda é mantido. Para mim, o suporte aos delegados também funciona melhor do que com o Spidermonkey-dotnet.

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

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

JB.
fonte
3
+1 Eu não sabia totalmente desse projeto, parece promissor, espero que ele não morra como a maioria dos outros projetos que tentam fazer a mesma coisa!
Peter
Uma coisa que achei diferente no ClearScript usando o mecanismo Windows.JScript é que os objetos .net agora diferenciam maiúsculas de minúsculas, onde o objeto ScriptControl mais antigo não importava.
precisa saber é o seguinte
Aqui está o meu problema com o ClearScript. Ao executá-lo, há dlls ausentes. Então me pedem para instalar componentes extras do visual studio. Isso não é problema, exceto que não terei privilégios de administrador onde executarei o código. Seria bom se fosse totalmente independente em uma dll.
TatiOverflow
38

Qualquer pessoa que esteja apenas de olho no Jurassic também:

http://jurassic.codeplex.com/

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

https://github.com/paulbartrum/jurassic

bbqchickenrobot
fonte
3
Parece que este é um dos poucos projetos que possuem código .NET nativo (em vez de usar o mecanismo V8, por exemplo) e ainda parece ser suportado (Ecmascript.net, jscript.net e vários outros). morto). +1 e obrigado pelo link!
Atlaste
2
Depois de verificar todos os projetos listados nessas respostas, eu me concentrei em Jurassic. É um dos dois ou três que ainda são mantidos ativamente, é JS verdadeiro, altamente testado e é .NET puro.
Roman Starkov 03/02
Acrescentaria meu apoio ao Jurássico. Ele também tem a capacidade de serializar o estado de execução do contexto de execução. Isso significa que você pode literalmente manter seu tempo de execução JavaScript, variáveis ​​e tudo. Recurso extremamente útil para alguns casos.
Jerome Haltom
Oi wasabi, não consegui encontrar nada sobre como serializar o estado de execução do contexto de execução. Como você conseguiu isso?
Henning
8

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

Sergi Mansilla
fonte
Atualmente, usamos o IronJS, mas atualmente é um projeto morto e o compilador está escrito em F #, com o qual posso usar ferramentas, mas não sou proficiente.
russbishop
7

Acho que ainda não estou claro sobre o que você está tentando fazer, mas vale a pena examinar o JScript.NET, embora o JScript gerenciado pareça ser mais adequado às suas necessidades (é mais como JavaScript do 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.

Jason Bunting
fonte
na verdade, o JScript gerenciado é a coisa mais próxima das minhas necessidades. Eu sabia que estava no Silverlight, não sabia que foi lançado. O JScript.NET não é uma opção. Eu realmente não quero dar aos usuários acesso a toda a pilha do .NET. Eu só preciso de alguns objetos internos principais que eles podem usar para seus aplicativos.
Aprilchild 6/10/08
17
Estamos em 2009 e o JScript gerenciado está morto agora.
Alexander Abramov
5

Se o idioma não for um problema (qualquer script com caixa de areia), haverá o LUA for .NET . A versão Silverlight da estrutura .NET também está na caixa de areia.

Chris S
fonte
5

Ei, dê uma olhada no Javascript .NET no codeplex ( http://javascriptdotnet.codeplex.com/ ) com a versão 0.3.1, existem alguns novos recursos bastante interessantes que provavelmente lhe interessarão.

Confira um código de exemplo:

// 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"));
Diácono Gelo
fonte
Isso funciona para objetos .Net. Por exemplo: se eu tiver uma classe Employee, posso passar o objeto para a V8 e manipular o objeto Employee do JavaScript?
Joy George Kunjikkuru
5

Eu vim com uma solução muito mais simples.

.dllCriei um arquivo usando Javascript e o compilei usando o compilador Javascript, disponível em um prompt de comando do desenvolvedor do VS2013.

Assim que tivermos .dll, basta adicioná-lo à \Supportpasta e referenciá-lo no projeto, o qual é necessário para avaliar as declarações Javascript.

Etapas detalhadas para criar um .dll:

  1. Crie um arquivo no bloco de notas com apenas este conteúdo:

    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, VS2005 Tools)

  4. Digite Cd\para chegar aC:\

  5. Tipo

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

  7. Copie MyEval.dllpara o projeto e faça referência a ele (também faça referência Microsoft.Jscript.dll).

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

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

objResult é True.

sinanguler
fonte
4

Eu apenas tentei o RemObjects Script para .Net .

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

Portanto: 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 os assemblies em um diretório é negativo para mim ...

sanosdole
fonte
2

A maneira documentada da Microsoft de adicionar extensibilidade de script a qualquer coisa é IActiveScript. Você pode usar o IActiveScript de qualquer aplicativo .NET para chamar a lógica de script. A lógica pode fazer parte dos objetos .NET que você inseriu no contexto de script.

Esta resposta fornece um aplicativo que faz isso com o código:

Cheeso
fonte
2

Existe uma implementação de um Host do Mecanismo de Script ActiveX em C # disponível aqui: analise e execute JS por C #

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

Por exemplo, o seguinte código:

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

exibirá 1.66666666666667

Simon Mourier
fonte
2

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

Simon
fonte
1

Eu acredito que todos os principais mecanismos JS de código aberto (JavaScriptCore, SpiderMonkey, V8 e KJS) fornecem APIs de incorporação. O único com o qual estou diretamente familiarizado é o JavaScriptCore (que é o nome do mecanismo JS no qual o SquirrelFish vive), que fornece uma API C pura. Se a memória serve (já faz algum tempo desde que eu usei o .NET), o .NET tem um suporte bastante bom para vincular as APIs C.

Sinceramente, não tenho certeza de como são as APIs dos outros mecanismos, mas sei que todas elas os fornecem.

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

olliej
fonte
2
Sim, todos os principais mecanismos geralmente são incorporáveis, mas existem obstáculos demais. estudando o guia de incorporação, aprendendo a API C (++). Eu esperava que já houvesse algum trabalho de integração feito. O JScript.NET não pode ser usado, o código real é gravado e executado pelos usuários da Internet.
Aprilchild 6/10/08
1

Eu sei que estou abrindo um tópico antigo, mas já trabalhei muito no smnet (spidermonkey-dotnet). Nos últimos anos. Seu foco principal de desenvolvimento foi a incorporação contínua de objetos .net no mecanismo spidermonkey. Ele suporta uma ampla variedade de conversões de valores js para objetos .net. Alguns deles, incluindo delegados e eventos.

Apenas dizendo que pode valer a pena verificar agora que há algum desenvolvimento constante nele :). Eu mantenho o repositório SVN atualizado com correções de bugs e novos recursos. Os arquivos de solução de origem e projeto são configurados para criar com êxito no download. Se houver algum problema ao usá-lo, sinta-se à vontade para abrir uma discussão.

Entendo o desejo de ter uma solução de javascript gerenciado, mas de todos os javascript gerenciados que usei, faltam alguns recursos importantes que ajudam a torná-los robustos e fáceis de trabalhar. Eu mesmo estou esperando que o IronJS amadureça 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.

SilverX
fonte
1

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

O ReoScript faz com que seu aplicativo possa executar JavaScript. Possui uma grande variedade de métodos 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 um winform e o 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 
Jing
fonte
0

Use o JSCRIPT.NET para obter uma biblioteca (dll) dos js. Em seguida, faça referência a esta dll no seu aplicativo .NET e você estará lá. FEITO!


fonte
0

O V8.NET é uma novidade no bloco (em abril de 2013) que envolve mais de perto a funcionalidade do mecanismo V8 nativo. Permite mais controle sobre a implementação.

James Wilkins
fonte
-5

É possível agora com o ASP.Net MVC4 Razormecanismo de exibição. o código será este:

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

// js snippet
<script type="text/javascript">
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 :)
</script>

e Razornão é apenas para MVC4 ou outros aplicativos da web e você pode usá-lo em aplicativos de desktop offline.

ahmadali shafiee
fonte