Osadzanie silnika JavaScript w .NET [zamknięte]

217

tylko zastanawiam się, czy ktoś kiedykolwiek próbował osadzić i faktycznie zintegrować silnik js ze środowiskiem .net. Mógłbym znaleźć i faktycznie użyć (po DUŻO bólu i wysiłku, ponieważ jest to dość przestarzałe i niezupełnie ukończone) projekt spidermonkey-dotnet. Ktoś z doświadczeniem w tej dziedzinie? Silniki takie jak SquirrelFish, V8 ..

Nie, że nie jestem zadowolony ze Spidermonkey Mozilli (używając go do minifruktury Railsowej dla niestandardowych komponentów w podstawowej aplikacji ASP.NET), ale nadal chciałbym zbadać nieco więcej z tymi opcjami. Rozwiązania wiersza polecenia nie są tym, czego potrzebuję, nie mogę polegać na niczym innym niż CLR, muszę wywoływać metody z / do JavaScript / C # obiektów.

// 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 :)

Tylko dla wyjaśnienia - nie próbuję programować samej aplikacji w javascript po stronie serwera. Służy wyłącznie do pisania niestandardowych podaplikacji użytkowników (może być postrzegane jako pewnego rodzaju DSL). O wiele łatwiej (i bezpieczniej) pozwala normalnym ludziom programować w js niż C #.

kwietnia
źródło

Odpowiedzi:

98

Wypróbuj Javascript .NET . Jest hostowany na GitHub. Pierwotnie był hostowany na CodePlex, tutaj )

Dyskusje na temat projektu: http://javascriptdotnet.codeplex.com/discussions

Implementuje Google V8. Za jego pomocą możesz kompilować i uruchamiać JavaScript bezpośrednio z kodu .NET, a także dostarczać obiekty CLI do użycia przez kod JavaScript. Generuje natywny kod z JavaScript.

Michel Boissé
źródło
+1. To proste i wydaje się działać świetnie.
JC Inacio
6
Istnieją twierdzenia, że ​​jest to martwe na forach dyskusyjnych projektu, dokumentacja poza podstawowym przykładem jest słaba i staram się dodać obsługę zdarzeń JavaScript do zdarzenia .Net za pomocą tego skryptu.
Alan Macdonald
6
Noesis (pierwotnie rozwijająca się firma) stracił zainteresowanie projektem, ale ostatecznie postanowił przekazać kontrolę społeczności. W związku z tym pojawiło się nowe wydanie, które zawiera wiele poprawek błędów. Niestety wywołania JavaScript z .Net nie są jeszcze obsługiwane.
Oliver Bock,
Kolejna uwaga na przyszłość: wygląda na to, że pakiet Nuget jest jakoś zakorkowany ... obecnie nie „działa” po zainstalowaniu pakietu.
Chris Pfohl
3
Ponieważ javascriptdotnet nie działa, rozważ użycie zamiast tego ClearScript (zobacz tę odpowiedź )
JB. Z Moniką.
86

Tłumacz Jint ( http://jint.codeplex.com ) z otwartym kodem JavaScript robi dokładnie to, czego szukasz.

Edycja:
Projekt został całkowicie przepisany i jest teraz hostowany w Github pod adresem https://github.com/sebastienros/jint

Sébastien Ros - MSFT
źródło
6
Inna możliwość oparta na DLR: RemObjects Script dla .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
kwiecień
Myślę, że jest napisany na Delphi Prism / Oxygen i podany jako kod źródłowy, więc jeśli nie kupiłeś licencji na wyżej wymienione produkty, nie jest to tak przydatne. Czy się mylę? Jeśli jest gdzieś wersja w formie binarnej, chciałbym spróbować.
Andrew Savinykh
2
Skrypt RemObjects jest napisany w Oxygene, prawda, ale tak naprawdę nie potrzebujesz licencji Oxygene, aby z niego korzystać - po pierwsze, możesz pobrać instalator binarny ze strony remobjects.com/free , dla innej możesz nawet uzyskać darmowy kompilator wiersza poleceń Oxygene, jeśli sam musiałeś go odbudować ze źródła. W końcu jedną z wielkich zalet platformy .NEt jest niezależność językowa. nie ma znaczenia, w jakim języku jest napisana biblioteka, abyś mógł z niej korzystać.
marc hoffman,
1
Ostatnie wydanie w 2011 roku ... Jurassic wydaje się lepszy.
Roman Starkov
3
Ostatnie wydanie w 2014 roku: github.com/sebastienros/jint
Sébastien Ros - MSFT
54

Być może zainteresuje Cię także Microsoft ClearScript, który jest hostowany na GitHub i opublikowany na licencji Ms-Pl.

Nie jestem fanboyem Microsoftu, ale muszę przyznać, że obsługa V8 ma mniej więcej takie same funkcje jak Javascript.Net, a co ważniejsze, projekt jest nadal utrzymywany. Moim zdaniem wsparcie dla delegatów również działa lepiej niż w przypadku Spidermonkey-dotnet.

ps: Obsługuje również JScript i VBScript, ale te stare rzeczy nie interesowały nas.

ps: jest kompatybilny z .NET 4.0 i 4.5+

JB.
źródło
3
+1 Byłem zupełnie nieświadomy tego projektu, wydaje się obiecujący, miejmy nadzieję, że nie umrze tak jak większość innych projektów próbujących zrobić to samo!
Peter
Jedną z rzeczy, które zauważyłem inaczej w ClearScript przy użyciu silnika Windows.JScript jest to, że w obiektach .net rozróżniana jest teraz wielkość liter, przy czym starszy obiekt ScriptControl nie miał znaczenia.
Brain2000
Oto mój problem z ClearScript. Po uruchomieniu narzeka, że ​​brakuje dll. Następnie poproszono mnie o zainstalowanie dodatkowych komponentów Visual Studio. To nie problem, z wyjątkiem tego, że nie będę miał uprawnień administratora, w których będę uruchamiał kod. Byłoby miło, gdyby był całkowicie samowystarczalny w bibliotece dll.
TatiOverflow
38

Każdy, kto tylko dostraja, sprawdź także Jurassic:

http://jurassic.codeplex.com/

edycja: przeniesiono to do github (i wydaje się aktywne na pierwszy rzut oka)

https://github.com/paulbartrum/jurassic

bbqchickenrobot
źródło
3
Wygląda na to, że jest to jeden z niewielu projektów, który ma zarówno natywny kod .NET (zamiast używać np. Silnika V8) i nadal wydaje się być obsługiwany (Ecmascript.net, jscript.net i kilka innych. nie żyje). +1 i dziękuję za link!
atlaste
2
Po sprawdzeniu każdego projektu wymienionego w tych odpowiedziach osiedliłem się w Jurassic. Jest jednym z dwóch lub trzech, które są nadal aktywnie utrzymywane, to jest prawdziwy JS, wysoce przetestowany i czysty .NET.
Roman Starkov
Dodałbym moje wsparcie dla jurajskiego. Ma również możliwość szeregowania stanu uruchamiania kontekstu wykonywania. Oznacza to, że możesz dosłownie zachować środowisko wykonawcze JavaScript, zmienne i wszystko inne. Niezwykle przydatna funkcja w niektórych przypadkach.
Jerome Haltom
Cześć wasabi, nie byłem w stanie znaleźć niczego, jak serializować stan uruchamiania kontekstu wykonania. Jak to osiągnąłeś?
Henning
8

Możesz spróbować ironJS, wygląda obiecująco, chociaż jest w fazie intensywnego rozwoju. https://github.com/fholm/IronJS

Sergi Mansilla
źródło
Obecnie używamy IronJS, ale obecnie jest to martwy projekt, a kompilator jest napisany w F #, w którym mogę się posługiwać, ale nie jestem biegły.
Russbishop
7

Wydaje mi się, że wciąż nie jestem pewien, co próbujesz zrobić, ale warto zajrzeć do JScript.NET, chociaż Managed JScript wydaje się być bardziej odpowiedni dla twoich potrzeb (bardziej przypomina JavaScript niż JScript.NET) .

Osobiście pomyślałem, że fajnie byłoby w jakiś sposób zintegrować V8, ale nie przeoczyłem pobierania kodu źródłowego; chciałbym mieć czas, żeby coś z tym zrobić.

Jason Bunting
źródło
w rzeczywistości Managed JScript jest najbliższy moim potrzebom. Wiedziałem, że jest w Silverlight, nie wiedziałem, że został wydany. JScript.NET nie jest opcją. Naprawdę nie chcę dać użytkownikom dostępu do całego stosu .NET. Potrzebuję tylko kilku podstawowych wbudowanych obiektów, których mogą używać w swoich aplikacjach.
kwietnia,
17
Jest 2009 rok, a Managed JScript jest teraz martwy.
Alexander Abramov
5

Jeśli język nie stanowi problemu (dowolnego skryptu w piaskownicy), istnieje LUA dla platformy .NET . Wersja .NET frameworku Silverlight jest również piaskownicą afaik.

Chris S.
źródło
5

Hej, spójrz na Javascript .NET na codeplex ( http://javascriptdotnet.codeplex.com/ ). W wersji 0.3.1 pojawiły się całkiem słodkie nowe funkcje, które prawdopodobnie Cię zainteresują.

Sprawdź przykładowy kod:

// 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"));
Deacon Frost
źródło
Czy to działa dla obiektów .Net. np .: jeśli mam klasę pracownika, czy mogę przekazać obiekt do wersji 8 i manipulować obiektem pracownika z JavaScript?
Joy George Kunjikkuru,
5

Zamiast tego wpadłem na znacznie prostsze rozwiązanie.

Zbudowałem .dllplik za pomocą Javascript, a następnie skompilowałem go za pomocą kompilatora JavaScript, który jest dostępny w wierszu polecenia programisty VS2013.

Kiedy już to .dllzrobimy, po prostu dodajemy go do \Supportfolderu, a następnie odwołujemy się do niego w projekcie, który musiał ewaluować instrukcje JavaScript.

Szczegółowe kroki, aby utworzyć .dll:

  1. Utwórz plik w Notatniku zawierający tylko te treści:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Zapisz plik jako C:\MyEval.js

  3. Otwórz wiersz polecenia VS2005 (Start, Programy, VS2005, Narzędzia VS2005)

  4. Wpisz, Cd\aby dostać się doC:\

  5. Rodzaj

    jsc /t:library C:\MyEval.js
  6. Zostanie utworzony nowy plik o nazwie MyEval.dll.

  7. Skopiuj MyEval.dlldo projektu i odwołaj się do niego (również odwołanie Microsoft.Jscript.dll).

  8. Powinieneś być w stanie to tak nazwać:

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

objResult is True.

sinanguler
źródło
4

Właśnie próbowałem RemObjects Script dla .Net .

Działa, chociaż musiałem użyć statycznej fabryki ( var a=A.createA();) z JavaScript zamiast var a=new A()składni. (Funkcja ExposeType ujawnia tylko statykę!) Niewiele dokumentacji, a źródło jest napisane za pomocą Delphi Prism, co jest dość niezwykłe dla mnie i dla RedGate Reflector.

Więc: Łatwy w użyciu i konfiguracji, ale niewiele pomocy w zaawansowanych scenariuszach.

Również instalowanie czegoś zamiast upuszczania zestawów w katalogu jest dla mnie negatywne ...

sanosdole
źródło
2

Udokumentowanym sposobem dodawania przez Microsoft rozszerzalności skryptu do czegokolwiek jest IActiveScript. Możesz użyć IActiveScript z dowolnej aplikacji .NET, aby wywołać logikę skryptu. Logika może imprezować na obiektach .NET umieszczonych w kontekście skryptowym.

Ta odpowiedź zawiera aplikację, która to robi, z kodem:

Cheeso
źródło
2

Istnieje implementacja hosta silnika skryptów ActiveX w C # dostępna tutaj: parsowanie i wykonywanie JS przez C #

Pozwala na używanie Javascript (lub VBScript) bezpośrednio z C #, w natywnych procesach 32-bitowych lub 64-bitowych. Pełne źródło to ~ 500 linii kodu C #. Ma tylko domyślną zależność od zainstalowanej biblioteki DLL silnika JScript (lub VBScript).

Na przykład następujący kod:

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

wyświetli 1.66666666666667

Simon Mourier
źródło
2

Istnieje również MsieJavaScriptEngine, który korzysta z silnika Chakra przeglądarki Internet Explorer

Szymon
źródło
1

Wierzę, że wszystkie główne silniki JS typu open source (JavaScriptCore, SpiderMonkey, V8 i KJS) zapewniają interfejsy API do osadzania. Jedyny, z kim tak naprawdę jestem bezpośrednio zaznajomiony, to JavaScriptCore (czyli nazwa silnika JS, w którym mieszka SquirrelFish), który zapewnia czysty interfejs API języka C. Jeśli pamięć działa (minęło trochę czasu, odkąd użyłem .NET) .NET ma dość dobrą obsługę łączenia w C API.

Szczerze mówiąc, nie jestem pewien, jakie są interfejsy API dla innych silników, ale wiem, że wszystkie je zapewniają.

To powiedziawszy, w zależności od twoich celów JScript.NET może być najlepszy, ponieważ wszystkie inne silniki będą wymagały dołączenia ich do Twojej aplikacji, ponieważ JSC jest jedynym, który faktycznie jest dostarczany z systemem operacyjnym, ale tym systemem operacyjnym jest MacOS: D

olliej
źródło
2
tak, wszystkie główne silniki można na ogół osadzić, ale przeszkód jest po prostu zbyt wiele. studiując przewodnik osadzania, ucząc się API C (++) .. miałem nadzieję, że już będzie trochę pracy nad integracją. Nie można użyć JScript.NET, rzeczywisty kod jest pisany i wykonywany przez internautów.
kwietnia,
1

Wiem, że otwieram stary wątek, ale dużo pracy nad smnetem (spidermonkey-dotnet). W ostatnich latach. Głównym celem projektu jest płynne osadzanie obiektów .net w silniku spidermonkey. Obsługuje szeroką gamę konwersji z wartości js na obiekty .net. Niektóre z nich, w tym delegaci i wydarzenia.

Powiem tylko, że warto się teraz przyjrzeć, ponieważ jest w nim pewien stały rozwój :). Aktualizuję repozytorium SVN na bieżąco z poprawkami błędów i nowymi funkcjami. Pliki rozwiązań źródłowych i projektów są skonfigurowane tak, aby pomyślnie budować po pobraniu. W przypadku problemów z korzystaniem z niego możesz otworzyć dyskusję.

Rozumiem pragnienie posiadania zarządzanego rozwiązania javascript, ale spośród wszystkich zarządzanych skryptów javascript, których używałem, bardzo brakuje im niektórych kluczowych funkcji, które sprawiają, że są one zarówno solidne, jak i łatwe w obsłudze. Sam czekam na IronJS, żeby trochę dojrzał. Podczas gdy czekam, dobrze się bawię grając ze spidermonkey-dotnet =)

spidermonkey-dotnet projekt i strona pobierania

Edycja: utworzono stronę wiki dokumentacji po południu.

SilverX
źródło
1

Wypróbuj ReoScript , interpreter JavaScript typu open source zaimplementowany w języku C #.

ReoScript sprawia, że ​​Twoja aplikacja może wykonywać JavaScript. Ma szeroką gamę metonów rozszerzeń, takich jak SetVariable, Extension Function, przy użyciu CLR Type, .Net Event Binding itp.

Witaj świecie:

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

A oto przykład skryptu, który tworzy winform i pokazuje go.

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
źródło
0

Użyj JSCRIPT.NET, aby uzyskać bibliotekę (dll) js. Następnie odwołaj się do tej biblioteki DLL w aplikacji .NET i już tam jesteś. GOTOWE!


źródło
0

V8.NET to nowe dziecko na bloku (od kwietnia 2013 r.), Które ściślej otacza natywną funkcjonalność silnika V8. Pozwala na większą kontrolę nad wdrożeniem.

James James Wilkins
źródło
-5

Teraz jest to możliwe dzięki ASP.Net MVC4 Razorsilnikowi View. kod będzie taki:

// 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>

i Razornie jest przeznaczony tylko dla MVC4 lub innych aplikacji internetowych i można go używać w aplikacjach stacjonarnych offline.

ahmadali shafiee
źródło