Menanamkan mesin JavaScript ke .NET [ditutup]

216

hanya ingin tahu apakah ada yang pernah mencoba menanamkan dan benar-benar mengintegrasikan mesin js ke dalam lingkungan .net. Saya dapat menemukan dan benar-benar menggunakan (setelah BANYAK rasa sakit dan usaha, karena itu cukup usang dan belum selesai) proyek spidermonkey-dotnet. Adakah yang berpengalaman di bidang ini? Mesin seperti SquirrelFish, V8 ..

Bukannya saya tidak puas dengan Mozilla's Spidermonkey (menggunakannya untuk miniframework Rails seperti untuk komponen kustom di dalam aplikasi inti ASP.NET), tapi saya masih ingin menjelajahi sedikit lebih jauh dengan opsi. Solusi baris perintah bukan yang saya butuhkan, saya tidak bisa mengandalkan apa pun selain CLR, saya perlu memanggil metode dari / ke objek 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 :)

Hanya untuk memperjelas - Saya tidak mencoba untuk benar-benar memprogram aplikasi itu sendiri di javascript sisi server. Ini digunakan semata-mata untuk menulis sub-aplikasi pengguna kustom (dapat dilihat sebagai semacam DSL). Jauh lebih mudah (dan lebih aman) untuk memungkinkan orang normal pemrograman dalam js daripada C #.

aprilchild
sumber

Jawaban:

98

Coba Javascript .NET . Di-host di GitHub Awalnya di-host di CodePlex, di sini )

Diskusi proyek: http://javascriptdotnet.codeplex.com/discussions

Ini mengimplementasikan Google V8. Anda dapat mengkompilasi dan menjalankan JavaScript langsung dari kode .NET dengannya, dan memasok objek CLI untuk digunakan oleh kode JavaScript juga. Ini menghasilkan kode asli dari JavaScript.

Michel Boissé
sumber
+1. Sederhana, dan tampaknya bekerja dengan baik.
JC Inacio
6
Ada klaim bahwa ini sudah mati di papan diskusi proyek, dokumentasi di luar contoh dasar buruk dan saya berjuang untuk menambahkan pengendali event JavaScript ke acara .Net dengan skrip.
Alan Macdonald
6
Noesis (perusahaan pengembang asli) kehilangan minat pada proyek, tetapi akhirnya memutuskan untuk memberikan kontrol kepada masyarakat. Akibatnya sekarang ada rilis baru yang mencakup banyak perbaikan bug. Sayangnya, panggilan balik JavaScript dari .Net belum didukung.
Oliver Bock
Catatan lain untuk masa depan: sepertinya paket Nuget borked entah bagaimana ... saat ini tidak "hanya berfungsi" ketika Anda menginstal paket.
Chris Pfohl
3
Karena javascriptdotnet sudah mati, pertimbangkan untuk menggunakan ClearScript (lihat jawaban ini )
JB. Dengan Monica.
86

Jint JavaScript interpreter open source ( http://jint.codeplex.com ) melakukan persis apa yang Anda cari.

Sunting:
Proyek ini telah sepenuhnya ditulis ulang dan sekarang dihosting di Github di https://github.com/sebastienros/jint

Sébastien Ros - MSFT
sumber
6
Kemungkinan lain dibangun di atas DLR: Skrip RemObjects untuk .NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild
Saya pikir itu ditulis di Delphi Prism / Oxygen, dan disediakan sebagai kode sumber jadi jika Anda belum membeli lisensi untuk produk-produk tersebut tidak berguna. Apakah aku salah? Jika ada versi dalam bentuk biner di mana saja saya ingin mencobanya.
Andrew Savinykh
2
Skrip RemObjects ditulis dalam Oxygene, benar, tetapi Anda sebenarnya tidak memerlukan lisensi Oxygene untuk menggunakannya - untuk satu, Anda bisa mendapatkan installer biner dari remobjects.com/free , untuk yang lain Anda bahkan bisa mendapatkan kompiler baris perintah Oxygene gratis jika Anda memang perlu membangunnya sendiri, dari sumber. Salah satu manfaat hebat dari platform .NEt adalah kemandirian bahasa. tidak masalah apa bahasa perpustakaan ditulis, bagi Anda untuk menggunakannya.
marc hoffman
1
Rilis terakhir pada 2011 ... Jurassic tampaknya lebih baik.
Roman Starkov
3
Rilis terakhir pada tahun 2014 sebenarnya: github.com/sebastienros/jint
Sébastien Ros - MSFT
54

Anda mungkin juga tertarik dengan Microsoft ClearScript yang di-host di GitHub dan diterbitkan di bawah lisensi Ms-Pl.

Saya bukan Microsoft fanboy, tetapi saya harus mengakui bahwa dukungan V8 memiliki fungsi yang sama dengan Javascript.Net, dan yang lebih penting, proyek ini masih dipertahankan. Sejauh yang saya ketahui, dukungan untuk delegasi juga berfungsi lebih baik daripada dengan Spidermonkey-dotnet.

ps: Ini juga mendukung JScript dan VBScript tetapi kami tidak tertarik dengan hal-hal lama ini.

ps: Ini kompatibel dengan .NET 4.0 dan 4.5+

JB.
sumber
3
+1 Saya benar-benar tidak menyadari proyek ini, sepertinya menjanjikan mari berharap itu tidak mati seperti kebanyakan proyek lain yang mencoba melakukan hal yang sama!
Peter
Satu hal yang saya temukan berbeda di ClearScript menggunakan mesin Windows.JScript adalah .net objek sekarang sensitif huruf, di mana objek ScriptControl yang lebih lama tidak masalah.
Brain2000
Ini masalah saya dengan ClearScript. Ketika menjalankannya mengeluh ada dll yang hilang. Kemudian saya diminta untuk menginstal komponen studio visual tambahan. Itu tidak masalah kecuali saya tidak akan memiliki hak admin di mana saya akan menjalankan kode. Akan lebih baik jika itu benar-benar mandiri dalam dll.
TatiOverflow
38

Siapa pun yang mau mendengarkan Jurassic juga:

http://jurassic.codeplex.com/

sunting: ini telah pindah ke github (dan tampaknya aktif sekilas)

https://github.com/paulbartrum/jurassic

bbqchickenrobot
sumber
3
Tampaknya ini adalah salah satu dari beberapa proyek yang memiliki kedua kode .NET asli (alih-alih menggunakan mesin V8) dan tampaknya masih didukung (Ecmascript.net, jscript.net, dan banyak lainnya tampaknya mati). +1 dan terima kasih atas tautannya!
atlaste
2
Setelah memeriksa setiap proyek yang tercantum dalam jawaban ini, saya sudah masuk di Jurassic. Ini salah satu dari hanya dua atau tiga yang masih dipelihara secara aktif, benar JS, sangat teruji, dan murni .NET.
Roman Starkov
Akan menambah dukungan saya untuk Jurassic. Ini juga memiliki kemampuan untuk membuat serial keadaan run dari konteks eksekusi. Itu berarti Anda benar-benar dapat bertahan runtime JavaScript Anda, variabel dan semua. Fitur yang sangat berguna untuk beberapa kasus.
Jerome Haltom
Hai wasabi, saya tidak dapat menemukan apa pun tentang cara membuat serial keadaan run dari konteks eksekusi. Bagaimana Anda mencapai itu?
Henning
8

Anda dapat mencoba ironJS, terlihat menjanjikan meskipun sedang dalam pengembangan. https://github.com/fholm/IronJS

Sergi Mansilla
sumber
Kami menggunakan IronJS saat ini tetapi ini adalah proyek mati hari ini dan kompiler ditulis dalam F # yang dapat saya bantu tetapi saya tidak mahir.
russbishop
7

Saya kira saya masih tidak jelas tentang apa yang Anda coba lakukan, tetapi JScript.NET mungkin layak untuk dilihat, meskipun Managed JScript sepertinya lebih cocok untuk kebutuhan Anda (lebih seperti JavaScript daripada JScript.NET) .

Secara pribadi, saya pikir akan lebih baik untuk mengintegrasikan V8 entah bagaimana, tetapi saya tidak bisa mengunduh kode sumber; berharap saya punya waktu untuk benar-benar melakukan sesuatu dengannya.

Jason Bunting
sumber
sebenarnya Managed JScript adalah hal yang paling dekat dengan kebutuhan saya. Saya tahu itu ada di Silverlight, tidak tahu itu dirilis. JScript.NET bukan opsi. Saya benar-benar tidak ingin memberi pengguna akses ke seluruh tumpukan .NET. Saya hanya perlu beberapa objek built-in inti yang dapat mereka gunakan untuk aplikasi mereka.
aprilchild
17
Ini tahun 2009 dan Managed JScript sudah mati sekarang.
Alexander Abramov
5

Jika bahasa tersebut bukan masalah (ada yang ditulis dengan kotak pasir) maka ada LUA untuk .NET . Versi Silverlight dari kerangka .NET juga merupakan sandboxed afaik.

Chris S
sumber
5

Hei, lihat Javascript .NET pada codeplex ( http://javascriptdotnet.codeplex.com/ ) dengan versi 0.3.1 ada beberapa fitur baru yang cukup manis yang mungkin akan menarik minat Anda.

Lihat kode contoh:

// 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"));
Diakon Frost
sumber
Apakah ini berfungsi untuk objek .Net. misalnya: Jika saya memiliki kelas Karyawan, bisakah saya meneruskan objek ke V8 dan memanipulasi objek Karyawan dari JavaScript?
Joy George Kunjikkuru
5

Saya datang dengan solusi yang lebih sederhana sebagai gantinya.

Saya membuat .dllfile menggunakan Javascript dan kemudian mengompilasinya menggunakan Javascript compiler yang tersedia di command prompt pengembang VS2013.

Setelah kami memiliki, .dllkami hanya menambahkannya ke \Supportfolder dan kemudian direferensikan dalam proyek yang diperlukan untuk mengevaluasi pernyataan Javascript.

Langkah-langkah terperinci untuk membuat .dll:

  1. Buat file di Notepad hanya dengan konten ini:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Simpan file sebagai C:\MyEval.js

  3. Buka Command Prompt VS2005 (Start, Programs, VS2005, VS2005 Tools)

  4. Ketik Cd\untuk sampai keC:\

  5. Tipe

    jsc /t:library C:\MyEval.js
  6. File baru dibuat dengan nama MyEval.dll.

  7. Salin MyEval.dllke proyek dan referensi itu (juga referensi Microsoft.Jscript.dll).

  8. Maka Anda harus dapat menyebutnya seperti ini:

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

objResult adalah True.

sinanguler
sumber
4

Saya baru saja mencoba Skrip RemObjects untuk .Net .

Berhasil, meskipun saya harus menggunakan pabrik statis ( var a=A.createA();) dari JavaScript alih-alih var a=new A()sintaks. (Fungsi ExposeType hanya memperlihatkan statika!) Tidak banyak dokumentasi dan sumber ditulis dengan Delphi Prism, yang agak tidak biasa bagi saya dan RedGate Reflector.

Jadi: Mudah digunakan dan diatur, tetapi tidak banyak membantu untuk skenario lanjutan.

Juga harus menginstal sesuatu, bukan hanya menjatuhkan majelis dalam direktori adalah negatif bagi saya ...

sanosdole
sumber
2

Cara terdokumentasi Microsoft untuk menambahkan perluasan skrip ke apa pun adalah IActiveScript. Anda dapat menggunakan IActiveScript dari dalam aplikasi .NET mana saja, untuk memanggil logika skrip. Logikanya bisa berpesta pada objek .NET yang Anda tempatkan dalam konteks skrip

Jawaban ini menyediakan aplikasi yang melakukannya, dengan kode:

Cheeso
sumber
2

Ada implementasi dari HostX Scripting Engine Host di C # tersedia di sini: parse dan jalankan JS oleh C #

Ini memungkinkan untuk menggunakan Javascript (atau VBScript) langsung dari C #, dalam proses 32-bit atau 64-bit asli. Sumber lengkapnya adalah ~ 500 baris kode C #. Ini hanya memiliki ketergantungan implisit pada DLL mesin JScript (atau VBScript) yang diinstal.

Misalnya, kode berikut:

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

akan menampilkan 1.6666666666666667

Simon Mourier
sumber
2

Ada juga MsieJavaScriptEngine yang menggunakan mesin Internet Explorers Chakra

Simon
sumber
1

saya percaya semua mesin JS opensource utama (JavaScriptCore, SpiderMonkey, V8, dan KJS) menyediakan API penyematan. Satu-satunya yang saya kenal secara langsung adalah JavaScriptCore (yang merupakan nama mesin JS tempat tinggal SquirrelFish) yang menyediakan API C murni. Jika ingatanku (sudah lama sejak saya menggunakan .NET) .NET memiliki dukungan yang cukup baik untuk menautkan dalam C API.

Jujur saya tidak yakin seperti apa API untuk mesin lain, tapi saya tahu mereka semua menyediakannya.

Yang mengatakan, tergantung pada tujuan Anda JScript.NET mungkin yang terbaik, karena semua mesin lain ini akan mengharuskan Anda untuk memasukkan mereka dengan aplikasi Anda, karena JSC adalah satu-satunya yang benar-benar dikirimkan dengan OS, tetapi OS itu adalah MacOS: D

olliej
sumber
2
ya, semua mesin utama umumnya dapat disematkan, tetapi ada terlalu banyak kendala. mempelajari panduan penyematan, mempelajari API C (++) .. saya berharap sudah ada beberapa pekerjaan pada integrasi yang dilakukan. JScript.NET tidak dapat digunakan, kode aktual ditulis dan dieksekusi oleh pengguna internet.
April
1

Saya tahu saya membuka utas lama tapi saya telah melakukan banyak pekerjaan pada smnet (spidermonkey-dotnet). Dalam beberapa tahun terakhir. Fokus pengembangan utamanya adalah penyisipan objek bersih ke dalam mesin spidermonkey. Ini mendukung berbagai konversi dari nilai js ke objek .net. Beberapa di antaranya termasuk delegasi dan acara.

Hanya mengatakan mungkin ada baiknya memeriksa sekarang bahwa ada beberapa perkembangan yang stabil di atasnya :). Saya selalu memperbarui repo SVN dengan perbaikan bug dan fitur baru. File sumber dan solusi proyek dikonfigurasikan agar berhasil dibangun saat diunduh. Jika ada masalah dalam menggunakannya, jangan ragu untuk membuka diskusi.

Saya mengerti keinginan untuk memiliki solusi javascript terkelola, tetapi dari semua javascript terkelola yang saya gunakan, semuanya sangat kurang dalam beberapa fitur utama yang membantu menjadikan keduanya kuat dan mudah dikerjakan. Saya sendiri sedang menunggu IronJS untuk menjadi sedikit dewasa. Sambil menunggu, saya bersenang-senang bermain dengan spidermonkey-dotnet =)

proyek spidermonkey-dotnet dan halaman unduh

Sunting: halaman dokumentasi wiki yang dibuat siang ini.

SilverX
sumber
1

Coba ReoScript , interpreter JavaScript open-source yang diimplementasikan dalam C #.

ReoScript membuat aplikasi Anda dapat menjalankan JavaScript. Ini memiliki berbagai meton ekstensi seperti SetVariable, Function Extension, menggunakan CLR Type, .Net Binding Event dan lain-lain.

Halo Dunia:

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

Dan di sini adalah contoh skrip yang menciptakan winform dan menunjukkannya.

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
sumber
0

Gunakan JSCRIPT.NET untuk mendapatkan perpustakaan (dll) dari js. Kemudian referensi dll ini di aplikasi .NET Anda dan Anda baru saja di sana. DIBUAT!


sumber
0

V8.NET adalah anak baru di blok (per April 2013) yang lebih dekat membungkus fungsi mesin V8 asli. Hal ini memungkinkan untuk lebih banyak kontrol atas implementasi.

James Wilkins
sumber
-5

Mungkin sekarang dengan ASP.Net MVC4 Razormesin View. kodenya adalah ini:

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

dan Razorbukan hanya untuk MVC4 atau aplikasi web lain dan Anda dapat menggunakannya dalam aplikasi desktop offline.

ahmadali shafiee
sumber