JavaScript motorunu .NET'e gömme [kapalı]


217

sadece kimse herhangi bir js motorunu .net ortamına katıştırmayı ve entegre etmeyi denediğini merak ediyor. Ben spidermonkey-dotnet projesi (oldukça eski ve çok bitmiş değil çünkü, bir sürü acı ve çaba sonra) bulabilir ve aslında kullanabilirsiniz . Bu alanda deneyimi olan var mı? SquirrelFish, V8 gibi motorlar.

Mozilla'nın Spidermonkey'sinden (çekirdek ASP.NET uygulaması içindeki özel bileşenler için Rails benzeri miniframework için kullanarak) memnun olmadığımdan değil, yine de seçeneklerle biraz daha fazla keşfetmek isterim. Komut satırı çözümleri ihtiyacım olan şey değil, CLR'den başka bir şeye güvenemiyorum, JavaScript / C # nesnelerine / yöntemlerini çağırmam gerekiyor.

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

Sadece açıklığa kavuşturmak için - aslında uygulamayı sunucu tarafı javascript programlamaya çalışmıyorum . Yalnızca özel kullanıcı alt uygulamaları yazmak için kullanılır (bir çeşit DSL olarak görülebilir). Normal insanlara js'de programlama yapmak C # 'dan daha kolay (ve daha güvenli).

Yanıtlar:


98

Javascript .NET'i deneyin . GitHub'da barındırılıyor. Başlangıçta CodePlex'te barındırılmıştır, burada )

Proje tartışmaları: http://javascriptdotnet.codeplex.com/discussions

Google V8'i uygular. JavaScript'i doğrudan .NET kodundan derleyip çalıştırabilir ve JavaScript kodu tarafından kullanılacak CLI nesnelerini de sağlayabilirsiniz. JavaScript'ten yerel kod oluşturur.


+1. Çok basit ve harika çalışıyor gibi görünüyor.
JC Inacio

6
Bunun projenin tartışma panolarında öldüğüne dair iddialar var, temel bir örneğin ötesindeki belgeler zayıf ve bir betikteki bir .Net olayına bir JavaScript olay işleyicisi eklemek için uğraşıyorum.
Alan Macdonald

6
Noesis (orijinal gelişen şirket) projeye olan ilgisini kaybetti, ancak sonunda topluma kontrol vermeye karar verdi. Sonuç olarak, birçok hata düzeltmesi içeren yeni bir sürüm var. Ne yazık ki .Net'ten JavaScript geri çağrıları henüz desteklenmemektedir.
Oliver Bock

Gelecek için başka bir not: Nuget paketinin bir şekilde donduğu anlaşılıyor ... şu anda paketi yüklediğinizde "sadece çalışmıyor".
Chris Pfohl

3
Javascriptdotnet öldüğünden, bunun yerine ClearScript kullanmayı düşünün (bu cevaba bakınız )
JB. Monica ile.

86

Açık kaynaklı JavaScript yorumlayıcısı Jint ( http://jint.codeplex.com ) tam olarak aradığınızı yapar.

Edit:
Proje tamamen yeniden yazılmıştır ve şimdi Gpsub'da https://github.com/sebastienros/jint adresinde barındırılmaktadır.


6
DLR üzerine inşa edilen başka bir olasılık: .NET için RemObjects Script remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild

Delphi Prism / Oxygen üzerinde yazıldığını ve kaynak kod olarak sağlandığını düşünüyorum, bu yüzden yukarıda belirtilen ürünler için bir lisans satın almadıysanız o kadar da kullanışlı değil. Yanlış mıyım? Herhangi bir yerde ikili biçimde bir sürümü varsa, ben denemek istiyorum.
Andrew Savinykh

2
RemObjects Script, Oxygene dilinde yazılmıştır, doğru, ancak aslında kullanmak için bir Oxygene lisansına ihtiyacınız yoktur - biri için, remobjects.com/free adresinden ikili yükleyiciyi alabilirsiniz, diğeri için ücretsiz Oxygene komut satırı derleyicisini bile alabilirsiniz kaynağı kendiniz yeniden oluşturmanız gerekiyordu. Sonuçta .NEt platformunun en büyük avantajlarından biri dil bağımsızlığı. kullanmanız için bir kütüphanenin hangi dilde yazılmış olduğu önemli değildir.
marc hoffman

1
2011'in son sürümü ... Jurassic daha iyi görünüyor.
Roman Starkov

3
2014'ün son sürümü aslında: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

Ayrıca ilginizi çekebilir GitHub'da barındırılan ve Ms-Pl lisansı altında yayınlanan Microsoft ClearScript ile .

Ben Microsoft fanboy değilim, ama itiraf etmeliyim ki V8 desteği Javascript.Net ile aynı işlevselliklere sahip ve daha da önemlisi, proje hala korunuyor. Bence, delegeler için destek Spidermonkey-dotnet'ten daha iyi çalışıyor.

ps: JScript ve VBScript'i de destekliyor, ancak bu eski şeylerle ilgilenmedik.

ps: .NET 4.0 ve 4.5+ ile uyumludur


3
+1 Bu projenin tamamen farkında değildim, umut verici görünüyor, aynı şeyi yapmaya çalışan diğer birçok proje gibi ölmeyeceğini umuyoruz!
Peter

Windows.JScript altyapısını kullanarak ClearScript'te farklı bulduğum şeylerden biri, eski ScriptControl nesnesinin önemli olmadığı .net nesnelerinin artık büyük / küçük harfe duyarlı olmasıdır.
Brain2000

İşte ClearScript ile ilgili sorunum. Çalıştırdığında eksik dlls şikayet ediyor. Sonra ekstra görsel stüdyo bileşenleri yüklemem isteniyor. Ben kodu çalıştıracak hiçbir yönetici ayrıcalığı olacak dışında bu sorun değil. Tamamen kendi içinde bir dll bulunan güzel olurdu.
TatiOverflow

38

Jurassic'i de kontrol eden herkes:

http://jurassic.codeplex.com/

edit: Bu github taşındı (ve ilk bakışta aktif görünüyor)

https://github.com/paulbartrum/jurassic


3
Bu, hem yerel .NET koduna (f.ex. V8 motorunu kullanmak yerine) sahip hem de hala destekleniyor gibi görünen birkaç projeden biri gibi görünüyor (Ecmascript.net, jscript.net ve diğerleri bir grup gibi görünüyor) ölü). +1 ve bağlantı için teşekkürler!
atlaste

2
Bu cevaplarda listelenen her bir projeyi kontrol ettikten sonra Jurassic'e girdim. Hala aktif olarak korunan sadece iki veya üç taneden biri, gerçek JS, yüksek test edilmiş ve saf .NET.
Roman Starkov

Jurassic'e desteğimi eklerdim. Ayrıca yürütme bağlamının çalışma durumunu serileştirme yeteneğine de sahiptir. Bu, JavaScript çalışma zamanınızı, değişkenlerinizi ve tümünü tam anlamıyla devam ettirebileceğiniz anlamına gelir. Bazı durumlar için son derece kullanışlı bir özellik.
Jerome Haltom

Merhaba wasabi, yürütme bağlamının çalışma durumunu serileştirme hakkında hiçbir şey bulamadım. Bunu nasıl başardınız?
Henning


7

Sanırım ne yapmaya çalıştığınız konusunda hala net değilim, ancak JScript.NET, göz atmaya değer olabilir, ancak Yönetilen JScript , ihtiyaçlarınız için daha uygun gibi görünebilir (JScript.NET'ten daha JavaScript gibidir) .

Şahsen, bir şekilde V8'i entegre etmenin harika olacağını düşündüm, ancak kaynak kodunu indirmeyi geçemedim; keşke onunla bir şeyler yapmak için zamanım olsaydı.


aslında Yönetilen JScript ihtiyaçlarıma en yakın şey. Silverlight'ta olduğunu biliyordum, serbest bırakıldığını bilmiyordum. JScript.NET bir seçenek değildir. Gerçekten kullanıcılara tüm .NET yığınına erişim vermek istemiyorum. Uygulamaları için kullanabilecekleri birkaç temel yerleşik nesneye ihtiyacım var.
Nisan

17
2009 ve Yönetilen JScript artık öldü.
Alexander Abramov

5

Dil bir sorun değilse (korumalı alandaki herhangi bir komut dosyası), LUA for .NET vardır . .NET çerçevesinin Silverlight sürümü de afaik korumalı alanıdır.


5

Hey 0.3.1 sürümü ile codeplex ( http://javascriptdotnet.codeplex.com/ ) Javascript .NET için bir göz atın muhtemelen ilginizi çekecek bazı oldukça tatlı yeni özellikler var.

Örnek bir kodu inceleyin:

// 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"));

Bu .Net nesneleri için çalışır. Örneğin: Bir Employee sınıfım varsa nesneyi V8'e geçirebilir ve Employee nesnesini JavaScript'ten değiştirebilir miyim?
Joy George Kunjikkuru


5

Bunun yerine çok daha basit bir çözüm buldum.

İnşa ettim .dllJavascript kullanarak dosya oluşturdum ve bir VS2013 geliştirici komut isteminde bulunan Javascript derleyicisini kullanarak derledim.

Elimizdeki kez .dllbiz sadece eklemek\Support klasöre ve sonra Javascript deyimlerini değerlendirmek için gerekli projede başvuru.

Aşağıdakileri oluşturmak için ayrıntılı adımlar .dll:

  1. Not Defteri'nde yalnızca şu içeriklere sahip bir dosya oluşturun:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Dosyayı farklı kaydet C:\MyEval.js

  3. Bir VS2005 Komut İstemi açın (Başlat, Programlar, VS2005, VS2005 Araçları)

  4. Almak Cd\için yazınC:\

  5. tip

    jsc /t:library C:\MyEval.js
  6. Adlı yeni bir dosya oluşturulur MyEval.dll.

  7. MyEval.dllProjeye kopyalayın ve referans alın (ayrıca referans Microsoft.Jscript.dll).

  8. O zaman şöyle diyebilmelisin:

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

objResult olduğunu True.


4

Ben sadece .Net için RemObjects Script denedim .

var a=A.createA();JavaScript yerine statik bir fabrika ( ) kullanmak zorunda olmasına rağmen çalışırvar a=new A() sözdizimi . (ExposeType işlevi yalnızca statik değerleri gösterir!) Çok fazla dokümantasyon yok ve kaynak benim için ve RedGate Reflektör için alışılmadık olan Delphi Prism ile yazılmış.

Yani: Kullanımı ve kurulumu kolaydır, ancak gelişmiş senaryolar için çok fazla yardımcı olmaz.

Ayrıca sadece bir dizinde derlemeleri bırakmak yerine bir şey yüklemek zorunda benim için olumsuz ...



2

Burada bir C # ActiveX Scripting Engine Host uygulaması vardır : ayrıştırmak ve JS C # ile yürütmek

Javascript'i (veya VBScript'i) 32 bit veya 64 bit yerel işlemlerde doğrudan C # üzerinden kullanmanıza izin verir. Tam kaynak ~ 500 satır C # kodudur. Yüklü JScript (veya VBScript) motor DLL'sine yalnızca örtük bir bağımlılığı vardır.

Örneğin, aşağıdaki kod:

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

1.66666666666667 gösterilecek



1

tüm büyük açık kaynaklı JS motorlarının (JavaScriptCore, SpiderMonkey, V8 ve KJS) gömme API'leri sağladığına inanıyorum. Aslında doğrudan tanıdığım tek kişi, saf bir C API'si sağlayan JavaScriptCore (SquirrelFish'in yaşadığı JS motorunun adı). Bellek (.NET kullandığımdan bu yana bir süre geçti). NET C API's bağlama için oldukça iyi bir destek var.

Dürüst olmak gerekirse diğer motorlar için API ne gibi emin değilim, ama hepsinin onları sağlamak biliyorum.

Bununla birlikte, amaçlarınıza bağlı olarak JScript.NET en iyi olabilir, çünkü diğer tüm motorlar bunları uygulamanıza dahil etmenizi gerektirecektir, çünkü JSC aslında bir işletim sistemi ile birlikte gelen tek sistemdir, ancak bu işletim sistemi MacOS: D'dir.


2
evet, tüm büyük motorlar genellikle gömülebilir, ancak çok fazla engel var. gömme kılavuzu inceleyerek, C (++) API öğrenme .. i zaten entegrasyon üzerinde bazı çalışmalar olacağını umuyordu. JScript.NET kullanılamaz, gerçek kod internet kullanıcıları tarafından yazılır ve yürütülür.
Nisan

1

Eski bir iş parçacığı açtığımı biliyorum ama smnet (spidermonkey-dotnet) üzerinde çok çalıştım. Son yıllarda. Ana geliştirme odağı, .net nesnelerinin spidermonkey motoruna sorunsuz bir şekilde yerleştirilmesidir. Js değerlerinden .net nesnelerine kadar çok çeşitli dönüşümleri destekler. Delegeler ve etkinlikler dahil bazıları.

Sadece üzerinde düzenli bir gelişme olduğunu kontrol etmeye değer olabilir :). Hata düzeltmeleri ve yeni özelliklerle SVN deposunu güncel tutuyorum. Kaynak ve proje çözümü dosyaları karşıdan yüklemeyi başarıyla oluşturacak şekilde yapılandırılmıştır. Kullanırken herhangi bir sorun varsa, bir tartışma açmaktan çekinmeyin.

Yönetilen bir javascript çözümüne sahip olma arzusunu anlıyorum, ancak kullandığım tüm yönetilen javascriptlerin hepsi, hem sağlam hem de çalışması kolay hale getirmeye yardımcı olan bazı temel özelliklerde çok eksik. Kendimi IronJS'de biraz olgunlaşmayı bekliyorum. Ben beklerken, spidermonkey-dotnet =) ile oynarken eğleniyorum

spidermonkey-dotnet projesi ve indirme sayfası

Düzenleme: bu öğleden sonra dokümantasyon wiki sayfası oluşturdu.


1

ReoScript'i deneyinC # 'da uygulanan açık kaynaklı bir JavaScript yorumlayıcısı olan .

ReoScript, uygulamanızın JavaScript çalıştırabilmesini sağlar. CLR Tipi, .Net Olay Bağlama vb. Kullanarak SetVariable, Function Extension, gibi çok çeşitli uzatma yöntemlerine sahiptir.

Selam Dünya:

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

Ve burada bir winform oluşturan ve bunu gösteren bir betik örneği.

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 

0

JS kitaplığı (dll) almak için JSCRIPT.NET kullanın. Sonra .NET uygulamanızda bu dll başvuru ve sadece orada. YAPILAN!



0

V8.NET blokta (Nisan 2013 itibariyle) yerel V8 motor işlevselliğini daha yakından saran yeni bir çocuk. Uygulama üzerinde daha fazla kontrole izin verir.


-5

Şimdi ASP.Net MVC4 RazorView motoru ile mümkün . kod şu şekilde olacaktır:

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

ve RazorMVC4 veya başka bir web uygulamaları için sadece değildir ve çevrimdışı masaüstü uygulamalarında kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.