Nhúng công cụ JavaScript vào .NET [đã đóng]


216

chỉ tự hỏi liệu có ai đã từng thử nhúng và thực sự tích hợp bất kỳ công cụ js nào vào môi trường .net không. Tôi có thể tìm và thực sự sử dụng (sau một LOT đau và công sức, vì nó khá lỗi thời và không hoàn toàn hoàn thành) Dự án SpiderMonkey-DotNet. Bất cứ ai có kinh nghiệm trong lĩnh vực này? Động cơ như SquirrelFish, V8 ..

Không phải là tôi không hài lòng với Spidermonkey của Mozilla (sử dụng nó cho miniframework cho các thành phần tùy chỉnh bên trong ứng dụng ASP.NET cốt lõi), nhưng tôi vẫn thích khám phá thêm một chút với các tùy chọn. Các giải pháp dòng lệnh không phải là thứ tôi cần, tôi không thể dựa vào bất cứ thứ gì ngoài CLR, tôi cần gọi các phương thức từ / đến các đối tượng 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 :)

Chỉ cần làm rõ - Tôi không cố gắng tự lập trình ứng dụng trong javascript phía máy chủ. Nó chỉ được sử dụng để viết các ứng dụng phụ người dùng tùy chỉnh (có thể được xem như một số loại DSL). Dễ dàng hơn nhiều (và an toàn hơn) khi cho phép người bình thường lập trình trong js so với C #.

Câu trả lời:


98

Hãy thử Javascript .NET . Nó được lưu trữ trên GitHub Ban đầu nó được lưu trữ trên CodePlex, tại đây )

Thảo luận về dự án: http://javascriptdotnet.codeplex.com/discussions

Nó triển khai Google V8. Bạn có thể biên dịch và chạy JavaScript trực tiếp từ mã .NET với nó và cung cấp các đối tượng CLI để sử dụng mã JavaScript. Nó tạo mã gốc từ JavaScript.


+1. Nó đơn giản, và dường như làm việc tuyệt vời.
JC Inacio

6
Có những tuyên bố rằng điều này đã chết trong các bảng thảo luận của dự án, tài liệu ngoài một ví dụ cơ bản là kém và tôi đang vật lộn để thêm một trình xử lý sự kiện JavaScript vào một sự kiện .Net với nó trong một kịch bản.
Alan Macdonald

6
Noesis (công ty phát triển ban đầu) mất hứng thú với dự án, nhưng cuối cùng quyết định trao quyền kiểm soát cho cộng đồng. Do đó, bây giờ có một bản phát hành mới bao gồm nhiều sửa lỗi. Thật không may, các cuộc gọi lại JavaScript từ .Net chưa được hỗ trợ.
Oliver Bock

Một lưu ý khác cho tương lai: có vẻ như gói Nuget bị vùi dập bằng cách nào đó ... hiện tại nó không "chỉ hoạt động" khi bạn cài đặt gói.
Chris Pfohl

3
Vì javascriptdotnet đã chết, thay vào đó hãy xem xét sử dụng ClearScript (xem câu trả lời này )
JB. Với Monica.

86

Trình thông dịch JavaScript mã nguồn mở Jint ( http://jint.codeplex.com ) thực hiện chính xác những gì bạn đang tìm kiếm.

Chỉnh sửa:
Dự án đã được viết lại hoàn toàn và hiện được lưu trữ trên Github tại https://github.com/sebastienros/jint


6
Một khả năng khác được xây dựng dựa trên DLR: RemObjects Script cho .NET remobjects.com/script.aspx blog.remobjects.com/bloss/ck/2010/02/23/p1175
aprilchild 23/210

Tôi nghĩ rằng nó được viết trên Delphi Prism / Oxygen và được cung cấp dưới dạng mã nguồn vì vậy nếu bạn chưa mua giấy phép cho các sản phẩm nói trên thì nó không hữu ích. Liệu tôi có sai? Nếu có một phiên bản ở dạng nhị phân ở bất cứ đâu tôi muốn dùng thử.
Andrew Savinykh

2
RemObjects Script được viết bằng Oxygene, đúng, nhưng bạn không thực sự cần giấy phép Oxygene để sử dụng nó - đối với một, bạn có thể nhận trình cài đặt nhị phân từ remobjects.com/free , đối với người khác, bạn thậm chí có thể có trình biên dịch dòng lệnh Oxygene miễn phí nếu bạn cần phải tự xây dựng lại từ nguồn. Một trong những lợi ích tuyệt vời của nền tảng .NEt là sự độc lập về ngôn ngữ. thư viện được viết bằng ngôn ngữ nào không quan trọng, để bạn sử dụng nó.
marc hoffman

1
Lần phát hành cuối cùng vào năm 2011 ... Jurassic có vẻ tốt hơn.
Roman Starkov

3
Bản phát hành cuối cùng vào năm 2014 thực sự: github.com/sebastienros/jint
Sébastien Ros - MSFT

54

Bạn cũng có thể quan tâm đến Microsoft ClearScript được lưu trữ trên GitHub và được xuất bản theo giấy phép Ms-Pl.

Tôi không phải là fanboy của Microsoft, nhưng tôi phải thừa nhận rằng hỗ trợ V8 có cùng chức năng với Javascript.Net, và quan trọng hơn, dự án vẫn được duy trì. Theo tôi thấy, sự hỗ trợ cho các đại biểu cũng hoạt động tốt hơn so với Spidermonkey-dotnet.

ps: Nó cũng hỗ trợ JScript và VBScript nhưng chúng tôi không quan tâm đến thứ cũ này.

ps: Nó tương thích với .NET 4.0 và 4.5+


3
+1 Tôi hoàn toàn không biết về dự án này, có vẻ như hứa hẹn sẽ hy vọng nó không chết như hầu hết các dự án khác đang cố gắng làm điều tương tự!
Peter

Một điều tôi đã tìm thấy khác nhau trong ClearScript khi sử dụng công cụ Windows.JScript là các đối tượng .net hiện phân biệt chữ hoa chữ thường, trong đó đối tượng ScriptControl cũ không quan trọng.
Brain2000

Đây là vấn đề của tôi với ClearScript. Khi chạy nó phàn nàn có thiếu dlls. Sau đó tôi được yêu cầu cài đặt thêm các thành phần phòng thu trực quan. Điều đó không có vấn đề gì ngoại trừ tôi sẽ không có đặc quyền quản trị nơi tôi sẽ chạy mã. Sẽ thật tuyệt nếu nó hoàn toàn khép kín trong một dll.
TatiOverflow

38

Bất cứ ai cũng chỉ cần điều chỉnh trong kiểm tra Jurassic là tốt:

http://jurassic.codeplex.com/

chỉnh sửa: điều này đã chuyển sang github (và có vẻ hoạt động từ cái nhìn đầu tiên)

https://github.com/paulbartrum/jurassic


3
Có vẻ như đây là một trong số ít các dự án có cả mã .NET gốc (thay vì sử dụng f.ex. công cụ V8) và dường như vẫn được hỗ trợ (Ecmascript.net, jscript.net và một loạt các dự án khác dường như đã chết). +1 và cảm ơn vì liên kết!
đúng

2
Sau khi kiểm tra từng dự án được liệt kê trong các câu trả lời này, tôi đã tham gia vào Jurassic. Đó là một trong hai hoặc ba vẫn đang được duy trì tích cực, đó là JS thực sự, được thử nghiệm cao và là .NET thuần túy.
Roman Starkov

Sẽ thêm hỗ trợ của tôi cho Jurassic. Nó cũng có khả năng tuần tự hóa trạng thái chạy của bối cảnh thực thi. Điều đó có nghĩa là bạn có thể duy trì thời gian chạy JavaScript, các biến và tất cả. Tính năng cực kỳ hữu ích cho một số trường hợp.
Jerome Haltom

Xin chào wasabi, tôi không thể tìm thấy bất cứ điều gì về cách tuần tự hóa trạng thái chạy của bối cảnh thực thi. Làm thế nào bạn đạt được điều đó?
Henning

8

Bạn có thể thử dùng IronJS, trông có vẻ đầy hứa hẹn mặc dù nó đang trong giai đoạn phát triển nặng nề. https://github.com/fholm/IronJS


Hiện tại chúng tôi sử dụng IronJS nhưng đây là một dự án đã chết và trình biên dịch được viết bằng F # mà tôi có thể sử dụng nhưng không thành thạo.
russbishop

7

Tôi đoán tôi vẫn chưa rõ về những gì bạn đang cố gắng thực hiện, nhưng JScript.NET có thể đáng để xem xét, mặc dù Managed JScript có vẻ như có thể phù hợp hơn với nhu cầu của bạn (nó giống JavaScript hơn JScript.NET) .

Cá nhân, tôi nghĩ rằng sẽ rất tuyệt nếu tích hợp V8 bằng cách nào đó, nhưng tôi đã không tải về mã nguồn; ước gì tôi có thời gian để thực sự làm điều gì đó với nó.


Trên thực tế Managed JScript là thứ gần nhất với nhu cầu của tôi. Tôi biết nó ở Silverlight, không biết nó đã được phát hành. JScript.NET không phải là một lựa chọn. Tôi thực sự không muốn cung cấp cho người dùng quyền truy cập vào toàn bộ ngăn xếp .NET. Tôi chỉ cần vài đối tượng tích hợp lõi mà họ có thể sử dụng cho các ứng dụng của mình.
aprilchild

17
Đó là năm 2009 và Managed JScript đã chết.
Alexander Abramov

5

Nếu ngôn ngữ không phải là vấn đề (bất kỳ kịch bản nào được đóng hộp theo kịch bản) thì có LUA cho .NET . Phiên bản Silverlight của .NET framework cũng được afaik sandbox.


5

Xin hãy xem Javascript .NET trên codeplex ( http://javascriptdotnet.codeplex.com/ ) với phiên bản 0.3.1 có một số tính năng mới khá ngọt ngào sẽ khiến bạn quan tâm.

Kiểm tra mã mẫu:

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

Điều này có làm việc cho các đối tượng .Net. ví dụ: Nếu tôi có lớp Nhân viên, tôi có thể chuyển đối tượng sang V8 và thao tác với đối tượng Nhân viên từ JavaScript không?
Joy George Kunjikkuru


5

Tôi đã đưa ra một giải pháp đơn giản hơn nhiều thay thế.

Tôi đã xây dựng một .dlltệp bằng Javascript và sau đó biên dịch nó bằng trình biên dịch Javascript có sẵn trong dấu nhắc lệnh của nhà phát triển VS2013.

Khi chúng tôi có, .dllchúng tôi chỉ cần thêm nó vào \Supportthư mục và sau đó tham chiếu nó trong dự án cần thiết để đánh giá các câu lệnh Javascript.

Các bước chi tiết để tạo một .dll:

  1. Tạo một tệp trong Notepad chỉ với những nội dung sau:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. Lưu tệp dưới dạng C:\MyEval.js

  3. Mở Dấu nhắc lệnh VS2005 (Bắt đầu, Chương trình, Công cụ VS2005, VS2005)

  4. Nhập Cd\để nhậnC:\

  5. Kiểu

    jsc /t:library C:\MyEval.js
  6. Một tập tin mới được tạo ra có tên MyEval.dll.

  7. Sao chép MyEval.dllvào dự án và tham chiếu nó (cũng tham khảo Microsoft.Jscript.dll).

  8. Sau đó, bạn sẽ có thể gọi nó như thế này:

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

objResult là True.


4

Tôi vừa thử RemObjects Script cho .Net .

Nó hoạt động, mặc dù tôi phải sử dụng một nhà máy tĩnh ( var a=A.createA();) từ JavaScript thay vì var a=new A()cú pháp. (Hàm ExposeType chỉ hiển thị số liệu thống kê!) Không có nhiều tài liệu và nguồn được viết bằng Delphi Prism, điều này khá bất thường đối với tôi và RedGate Reflector.

Vì vậy: Dễ sử dụng và thiết lập, nhưng không giúp ích nhiều cho các tình huống nâng cao.

Ngoài ra việc phải cài đặt một cái gì đó thay vì chỉ bỏ các cụm trong một thư mục là một điều tiêu cực đối với tôi ...


2

Cách tài liệu của Microsoft để thêm khả năng mở rộng tập lệnh vào bất cứ điều gì là IActiveScript. Bạn có thể sử dụng IActiveScript từ bên trong ứng dụng .NET, để gọi logic tập lệnh. Logic có thể tiệc tùng trên các đối tượng .NET mà bạn đã đặt vào ngữ cảnh kịch bản.

Câu trả lời này cung cấp một ứng dụng thực hiện nó, với mã:


2

Có một triển khai Máy chủ lưu trữ công cụ ActiveX trong C # có sẵn tại đây: phân tích và thực thi JS bằng C #

Nó cho phép sử dụng Javascript (hoặc VBScript) trực tiếp từ C #, trong các quy trình 32 bit hoặc 64 bit gốc. Nguồn đầy đủ là ~ 500 dòng mã C #. Nó chỉ có một sự phụ thuộc ngầm định vào DLL công cụ JScript (hoặc VBScript) đã cài đặt.

Ví dụ: đoạn mã sau:

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

sẽ hiển thị 1.66666666666667



1

Tôi tin rằng tất cả các công cụ JS mã nguồn mở chính (JavaScriptCore, SpiderMonkey, V8 và KJS) đều cung cấp các API nhúng. Người duy nhất tôi thực sự quen thuộc trực tiếp là JavaScriptCore (tên của công cụ JS mà SquirrelFish sống) cung cấp API C thuần túy. Nếu bộ nhớ phục vụ (đã được một thời gian kể từ khi tôi sử dụng .NET) thì .NET có hỗ trợ khá tốt để liên kết trong C API.

Tôi thực sự không chắc API của các công cụ khác là như thế nào, nhưng tôi biết rằng tất cả chúng đều cung cấp chúng.

Điều đó nói rằng, tùy thuộc vào mục đích của bạn, JScript.NET có thể là tốt nhất, vì tất cả các công cụ khác này sẽ yêu cầu bạn đưa chúng vào ứng dụng của mình, vì JSC là công cụ duy nhất thực sự có hệ điều hành, nhưng HĐH đó là MacOS: D


2
vâng, tất cả các động cơ chính thường có thể nhúng, nhưng đơn giản là có quá nhiều trở ngại. nghiên cứu hướng dẫn nhúng, học API C (++) .. tôi đã hy vọng sẽ có một số công việc về tích hợp được thực hiện. JScript.NET không thể được sử dụng, mã thực tế được viết và thực thi bởi người dùng internet.
aprilchild

1

Tôi biết tôi đang mở một chủ đề cũ nhưng tôi đã thực hiện rất nhiều công việc trên smnet (spidermonkey-dotnet). Trong những năm gần đây. Trọng tâm phát triển chính của nó là nhúng liền mạch các đối tượng .net vào công cụ spidermonkey. Nó hỗ trợ nhiều loại chuyển đổi từ giá trị js sang các đối tượng .net. Một số trong đó bao gồm các đại biểu và sự kiện.

Chỉ cần nói rằng có thể đáng để kiểm tra ngay bây giờ rằng có một số phát triển ổn định về nó :). Tôi luôn cập nhật SVN repo với các sửa lỗi và các tính năng mới. Các tập tin giải pháp nguồn và dự án được cấu hình để xây dựng thành công khi tải xuống. Nếu có bất kỳ vấn đề nào khi sử dụng nó, vui lòng mở một cuộc thảo luận.

Tôi hiểu được mong muốn có một giải pháp javascript được quản lý, nhưng trong tất cả các javascript được quản lý, tôi đã sử dụng tất cả chúng đều thiếu một số tính năng chính giúp chúng trở nên mạnh mẽ và dễ làm việc. Bản thân tôi đang chờ đợi IronJS trưởng thành một chút. Trong khi chờ đợi, tôi rất vui khi chơi với spidermonkey-dotnet =)

dự án spidermonkey-dotnet và trang tải xuống

Chỉnh sửa: tạo tài liệu trang wiki chiều nay.


1

Hãy thử ReoScript , trình thông dịch JavaScript mã nguồn mở được triển khai trong C #.

ReoScript làm cho ứng dụng của bạn có thể thực thi JavaScript. Nó có nhiều loại methon mở rộng như SetVariable, Extension Extension, sử dụng CLR Type, .Net Event Binding, v.v.

Chào thế giới:

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

Và đây là một ví dụ về kịch bản tạo ra một winform và hiển thị nó.

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

Sử dụng JSCRIPT.NET để nhận thư viện (dll) của js. Sau đó tham khảo dll này trong ứng dụng .NET của bạn và bạn chỉ ở đó. LÀM XONG!



0

V8.NET là một đứa trẻ mới trên khối (kể từ tháng 4 năm 2013) bao bọc chặt chẽ hơn chức năng động cơ V8 nguyên gốc. Nó cho phép kiểm soát nhiều hơn đối với việc thực hiện.


-5

Bây giờ có thể với ASP.Net MVC4 Razorcông cụ View. mã sẽ là thế này:

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

Razorkhông chỉ dành cho MVC4 hoặc các ứng dụng web khác và bạn có thể sử dụng nó trong các ứng dụng máy tính để bàn ngoại tuyến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.