การฝังเอ็นจิ้น JavaScript ลงใน. NET [ปิด]


217

เพียงแค่สงสัยว่ามีใครเคยลองใช้การฝังและรวมเอาเอ็นจิน js ใด ๆ เข้ากับสภาพแวดล้อม. net ฉันสามารถค้นหาและใช้งานจริง (หลังจากที่มากของความเจ็บปวดและความพยายามตั้งแต่มันล้าสมัยสวยและไม่ได้ค่อนข้างสำเร็จรูป) โครงการ spidermonkey-dotnet ใครบ้างที่มีประสบการณ์ในด้านนี้ เครื่องยนต์เช่น SquirrelFish, V8 ..

ไม่ใช่ว่าฉันไม่พอใจกับ Spidermonkey ของ Mozilla (ใช้สำหรับ miniframework เหมือน Rails สำหรับคอมโพเนนต์ที่กำหนดเองภายในแอปพลิเคชัน ASP.NET หลัก) แต่ฉันก็ยังอยากสำรวจตัวเลือกเพิ่มเติมอีกเล็กน้อย โซลูชันบรรทัดคำสั่งไม่ใช่สิ่งที่ฉันต้องการฉันไม่สามารถพึ่งพาสิ่งอื่นนอกจาก CLR ได้ฉันต้องเรียกใช้เมธอดจาก / ถึง 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 :)

เพื่อชี้แจง - ฉันไม่ได้พยายามตั้งโปรแกรมเองในจาวาสคริปต์ฝั่งเซิร์ฟเวอร์ ใช้เพื่อการเขียนแอปพลิเคชันย่อยของผู้ใช้ที่กำหนดเองเท่านั้น (สามารถเห็นได้ว่าเป็น DSL บางประเภท) ง่ายขึ้น (และปลอดภัยยิ่งขึ้น) ในการอนุญาตให้ผู้คนทั่วไปเขียนโปรแกรมเป็น js มากกว่า C #

คำตอบ:


98

ลองJavascript .NET มันเป็นเจ้าภาพใน GitHub มันเคยเป็นเจ้าภาพใน CodePlex ที่นี่ )

การอภิปรายโครงการ: http://javascriptdotnet.codeplex.com/discussions

มันใช้ Google V8 คุณสามารถรวบรวมและเรียกใช้ JavaScript โดยตรงจากรหัส. NET และให้วัตถุ CLI ที่จะใช้โดยรหัส JavaScript เช่นกัน มันสร้างรหัสพื้นเมืองจาก JavaScript


+1 มันง่ายและดูเหมือนว่าจะทำงานได้ดี
JC Inacio

6
มีการอ้างว่าสิ่งนี้เสียชีวิตในกระดานสนทนาของโครงการเอกสารที่นอกเหนือจากตัวอย่างพื้นฐานไม่ดีและฉันกำลังพยายามเพิ่มตัวจัดการเหตุการณ์ JavaScript ให้กับเหตุการณ์. Net ด้วยสคริปต์
Alan Macdonald

6
Noesis (บริษัท พัฒนาดั้งเดิม) หมดความสนใจในโครงการ แต่ในที่สุดก็ตัดสินใจที่จะควบคุมชุมชน ดังนั้นขณะนี้มีการเปิดตัวใหม่ที่มีการแก้ไขข้อบกพร่องมากมาย ขออภัยการเรียกกลับ JavaScript จาก. Net ยังไม่รองรับ
Oliver Bock

ข้อควรทราบอีกประการหนึ่งสำหรับอนาคต: ดูเหมือนว่าแพคเกจ Nuget จะถูกบอร์กอย่างใด ... ในขณะนี้มันไม่ได้ "แค่ทำงาน" เมื่อคุณติดตั้งแพคเกจ
Chris Pfohl

3
เนื่องจาก javascriptdotnet ไม่ทำงานให้ลองใช้ ClearScript แทน (ดูคำตอบนี้)
JB กับโมนิก้า

86

ล่าม JavaScript แบบโอเพนซอร์ส Jint ( http://jint.codeplex.com ) ทำสิ่งที่คุณต้องการอย่างแท้จริง

แก้ไข:
โครงการได้รับการเขียนใหม่ทั้งหมดและขณะนี้โฮสต์บน Github ที่https://github.com/sebastienros/jint


6
ความเป็นไปได้อีกประการหนึ่งที่สร้างขึ้นบน DLR: RemObjects Script สำหรับ. NET remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild

ฉันคิดว่ามันเขียนไว้ใน Delphi Prism / Oxygen และให้เป็นซอร์สโค้ดดังนั้นหากคุณยังไม่ได้ซื้อใบอนุญาตสำหรับผลิตภัณฑ์ดังกล่าวข้างต้นก็ไม่มีประโยชน์ ฉันผิดหรือเปล่า? หากมีรุ่นในรูปแบบไบนารีทุกที่ที่ฉันต้องการจะลอง
Andrew Savinykh

2
RemObjects Script เขียนเป็น Oxygene ถูกต้อง แต่คุณไม่จำเป็นต้องมีใบอนุญาต Oxygene เพื่อใช้งาน - สำหรับอันหนึ่งคุณจะได้รับตัวติดตั้งแบบไบนารีจากremobjects.com/freeอีกอันหนึ่งคุณอาจได้รับคอมไพเลอร์บรรทัดคำสั่ง Oxygene ฟรีหาก คุณไม่จำเป็นต้องสร้างมันขึ้นมาใหม่ด้วยตัวเองจากแหล่งที่มา ข้อดีอย่างหนึ่งของแพลตฟอร์ม. NET คือความเป็นอิสระทางภาษา มันไม่สำคัญว่าภาษาใดที่ไลบรารี่จะเขียนขึ้นเพื่อให้คุณใช้
marc hoffman

1
รุ่นล่าสุดในปี 2011 ... จูราสสิคดูดีขึ้น
Roman Starkov

3
เปิดตัวครั้งล่าสุดในปี 2014 จริง ๆ : github.com/sebastienros/jint
Sébastien Ros - MSFT

54

คุณอาจสนใจMicrosoft ClearScript ซึ่งโฮสต์บน GitHub และเผยแพร่ภายใต้ใบอนุญาต Ms-Pl

ฉันไม่ใช่ Microsoft fanboy แต่ฉันต้องยอมรับว่าการสนับสนุน V8 มีฟังก์ชั่นเดียวกันกับ Javascript.Net และที่สำคัญกว่านั้นโครงการยังคงอยู่ เท่าที่ฉันกังวลการสนับสนุนสำหรับผู้ได้รับมอบหมายยังทำงานได้ดีกว่าด้วย Spidermonkey-dotnet

ps: นอกจากนี้ยังรองรับ JScript และ VBScript แต่เราไม่สนใจสิ่งเก่านี้

ps: มันเข้ากันได้กับ. NET 4.0 และ 4.5+


3
+1 ฉันไม่รู้โครงการนี้โดยสิ้นเชิงดูเหมือนว่าสัญญาจะช่วยให้หวังว่ามันจะไม่ตายเหมือนโครงการอื่น ๆ ส่วนใหญ่ที่พยายามทำสิ่งเดียวกัน!
ปีเตอร์

สิ่งหนึ่งที่ฉันพบว่าแตกต่างกันใน ClearScript โดยใช้โปรแกรม Windows.JScript คือตอนนี้วัตถุ. net จะคำนึงถึงขนาดตัวพิมพ์เล็กซึ่งวัตถุ ScriptControl รุ่นเก่าไม่สำคัญ
Brain2000

นี่คือปัญหาของฉันกับ ClearScript เมื่อเรียกใช้มันบ่นมีที่กำลังหายไป ฉันถูกขอให้ติดตั้งอุปกรณ์เสริม visual Studio เพิ่มเติม ไม่มีปัญหายกเว้นฉันจะไม่มีสิทธิ์ของผู้ดูแลระบบที่ฉันจะเรียกใช้รหัส มันจะดีถ้ามันเป็นตัวเองโดยสิ้นเชิงใน dll
TatiOverflow

38

ใครก็ตามแค่จูนเข้าชมจูราสสิเช่นกัน:

http://jurassic.codeplex.com/

แก้ไข: สิ่งนี้ได้ย้ายไปที่ GitHub (และดูเหมือนว่าใช้งานได้อย่างรวดเร็วก่อน)

https://github.com/paulbartrum/jurassic


3
ดูเหมือนว่านี่เป็นหนึ่งในไม่กี่โครงการที่มีทั้งรหัสเนทิฟ. NET (แทนที่จะใช้ f.ex. เอ็นจิ้น V8) และยังดูเหมือนว่าจะได้รับการสนับสนุน (Ecmascript.net, jscript.net และกลุ่มอื่น ๆ ดูเหมือนจะเป็น ตาย). +1 และขอบคุณสำหรับลิงค์!
atlaste

2
หลังจากตรวจสอบทุกโครงการที่ระบุไว้ในคำตอบเหล่านี้ฉันได้กลับไปทำการ Jurassic เป็นหนึ่งในสองหรือสามเท่านั้นที่ยังคงใช้งานได้จริงคือ JS จริงทดสอบสูงและบริสุทธิ์. NET
โรมัน Starkov

จะเพิ่มการสนับสนุนของฉันสำหรับจูราสสิ นอกจากนี้ยังมีความสามารถในการทำให้สถานะการทำงานของบริบทการดำเนินการเป็นอันดับ นั่นหมายความว่าคุณสามารถคงการใช้งาน JavaScript ตัวแปรและทั้งหมดได้ คุณสมบัติที่มีประโยชน์อย่างยิ่งสำหรับบางกรณี
Jerome Haltom

สวัสดีวาซาบิฉันไม่สามารถหาอะไรเกี่ยวกับวิธีการเรียงลำดับสถานะการทำงานของบริบทการดำเนินการ คุณประสบความสำเร็จได้อย่างไร
Henning

8

คุณสามารถลอง ironJS ดูมีแนวโน้มแม้ว่ามันจะมีการพัฒนาอย่างหนัก https://github.com/fholm/IronJS


เราใช้ IronJS ในปัจจุบัน แต่มันเป็นโครงการที่ตายแล้วทุกวันนี้และคอมไพเลอร์เขียนใน F # ซึ่งฉันสามารถใช้เครื่องมือได้ แต่ไม่ชำนาญ
russbishop

7

ฉันเดาว่าฉันยังไม่ชัดเจนเกี่ยวกับสิ่งที่คุณพยายามทำ แต่ JScript.NET อาจคุ้มค่าที่จะดูแม้ว่าManaged JScriptดูเหมือนว่ามันอาจจะเหมาะสมกับความต้องการของคุณมากกว่า (เช่น JavaScript มากกว่า JScript.NET) .

โดยส่วนตัวแล้วฉันคิดว่ามันคงจะเจ๋งที่จะรวม V8 อย่างใด แต่ฉันก็ไม่ได้ดาวน์โหลดซอร์สโค้ดมาก่อนเลย หวังว่าฉันจะมีเวลาทำอะไรกับมันจริง ๆ


จริง ๆ แล้ว Managed JScript เป็นสิ่งที่ใกล้เคียงกับความต้องการของฉันมากที่สุด ฉันรู้ว่ามันอยู่ใน Silverlight ไม่รู้ว่ามันเปิดตัว JScript.NET ไม่ใช่ตัวเลือก ฉันไม่ต้องการให้ผู้ใช้สามารถเข้าถึง. NET stack ทั้งหมด ฉันต้องการวัตถุในตัวหลักสองตัวที่พวกเขาสามารถใช้สำหรับแอปพลิเคชันของพวกเขา
เมษายน

17
ปี 2009 และ JScript ที่มีการจัดการนั้นตายแล้ว
Alexander Abramov


5

สวัสดีลองดู Javascript .NET บน codeplex ( http://javascriptdotnet.codeplex.com/) ) ด้วยรุ่น 0.3.1 มีฟีเจอร์ใหม่ที่น่าสนใจและน่าสนใจ

ลองดูโค้ดตัวอย่าง:

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

ใช้งานได้กับวัตถุ. Net เช่น: ถ้าฉันมีคลาส Employee ฉันจะส่งผ่านอ็อบเจกต์ไปยัง V8 และจัดการออบเจกต์ Employee จาก JavaScript ได้หรือไม่
Joy George Kunjikkuru


5

ฉันคิดวิธีแก้ปัญหาที่ง่ายกว่าแทน

ฉันสร้าง.dllไฟล์โดยใช้ Javascript แล้วรวบรวมโดยใช้ Javascript compiler ซึ่งมีอยู่ในพรอมต์คำสั่งของนักพัฒนา VS2013

เมื่อเรามี.dllเราก็เพิ่มเข้าไปใน\Supportโฟลเดอร์แล้วอ้างอิงในโครงการที่จำเป็นต้อง eval งบจาวาสคริปต์

ขั้นตอนโดยละเอียดเพื่อสร้าง.dll:

  1. สร้างไฟล์ใน Notepad ด้วยเนื้อหาเหล่านี้เท่านั้น:

    class EvalClass { function Evaluate(expression: String) { return eval(expression); } } 
  2. บันทึกไฟล์เป็น C:\MyEval.js

  3. เปิดพร้อมรับคำสั่ง VS2005 (เริ่ม, โปรแกรม, VS2005, เครื่องมือ VS2005)

  4. พิมพ์Cd\เพื่อไปที่C:\

  5. ชนิด

    jsc /t:library C:\MyEval.js
  6. MyEval.dllไฟล์ใหม่จะถูกสร้างชื่อ

  7. คัดลอกMyEval.dllไปยังโครงการและอ้างอิง (อ้างอิงด้วยMicrosoft.Jscript.dll)

  8. จากนั้นคุณควรจะสามารถเรียกสิ่งนี้ได้:

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

objResult Trueคือ


4

ฉันก็พยายามRemObjects สคริปต์สำหรับ NET

มันใช้งานได้แม้ว่าฉันจะต้องใช้โรงงานแบบคงที่ ( var a=A.createA();) จาก JavaScript แทนvar a=new A()ไวยากรณ์ (ฟังก์ชั่น ExposeType เท่านั้นเปิดเผยสถิตยศาสตร์!) เอกสารไม่มากและแหล่งที่มาจะถูกเขียนด้วย Delphi Prism ซึ่งค่อนข้างแปลกสำหรับฉันและ RedGate Reflector

ดังนั้น: ใช้งานง่ายและตั้งค่าได้ แต่ไม่มีความช่วยเหลือสำหรับสถานการณ์ขั้นสูง

นอกจากนี้ยังต้องติดตั้งบางสิ่งแทนที่จะวางชุดประกอบในไดเรกทอรีเป็นลบสำหรับฉัน ...


2

เอกสารวิธีของ Microsoft ในการเพิ่มความสามารถในการขยายสคริปต์ให้กับทุกสิ่งคือ IActiveScript คุณสามารถใช้ IActiveScript จากภายในแอป. NET ใด ๆ เพื่อเรียกตรรกะของสคริปต์ ตรรกะสามารถปาร์ตี้บนวัตถุ. NET ที่คุณวางไว้ในบริบทการเขียนสคริปต์

คำตอบนี้ให้แอปพลิเคชันที่ทำงานพร้อมรหัส:


2

มีการใช้งานActiveX Scripting Engine Host ใน C # พร้อมใช้งานที่นี่: แจงและดำเนินการ JS โดย C #

อนุญาตให้ใช้ Javascript (หรือ VBScript) โดยตรงจาก C # ในกระบวนการ 32 บิตหรือ 64 บิตดั้งเดิม แหล่งที่มาแบบเต็มคือรหัส C # 500 บรรทัด มันมีการพึ่งพาโดยนัยในเครื่องยนต์ JScript (หรือ VBScript) DLL ที่ติดตั้ง

ตัวอย่างเช่นรหัสต่อไปนี้:

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

จะแสดง 1.66666666666667



1

ฉันเชื่อว่าเครื่องมือ JS โอเพนซอร์สที่สำคัญทั้งหมด (JavaScriptCore, SpiderMonkey, V8 และ KJS) ให้การฝัง API อันเดียวที่ฉันคุ้นเคยโดยตรงคือ JavaScriptCore (ซึ่งเป็นชื่อของเอ็นจิน JS ที่ใช้ชีวิต SquirrelFish) ซึ่งให้ C API ที่บริสุทธิ์ หากหน่วยความจำทำหน้าที่ (ฉันใช้. NET มาระยะหนึ่งแล้ว). NET มีการสนับสนุนที่ดีพอสมควรสำหรับการลิงก์ใน C API

ฉันไม่แน่ใจว่า API ของเอ็นจิ้นอื่น ๆ นั้นเป็นอย่างไร แต่ฉันรู้ว่าพวกเขาทั้งหมดมีให้

ที่กล่าวว่าขึ้นอยู่กับวัตถุประสงค์ของคุณ JScript.NET อาจดีที่สุดเนื่องจากเครื่องมืออื่น ๆ เหล่านี้จะต้องให้คุณรวมไว้ในแอปของคุณเนื่องจาก JSC เป็นเพียงเครื่องมือเดียวที่มาพร้อมกับ OS จริง แต่ OS นั้นเป็น MacOS: D


2
ใช่เครื่องยนต์ที่สำคัญทั้งหมดมักจะฝังตัวได้ แต่มีอุปสรรคมากเกินไป ศึกษาคู่มือการฝังการเรียนรู้ API (++) API .. ฉันหวังว่าจะมีบางงานในการรวมเข้าด้วยกัน ไม่สามารถใช้ JScript.NET ได้รหัสจริงจะถูกเขียนและดำเนินการโดยผู้ใช้อินเทอร์เน็ต
เมษายน

1

ฉันรู้ว่าฉันกำลังเปิดเธรดเก่า แต่ฉันทำงานหลายอย่างใน smnet (spidermonkey-dotnet) ในช่วงไม่กี่ปีที่ผ่านมา มันมุ่งเน้นการพัฒนาหลักได้อย่างราบรื่นฝัง. วัตถุสุทธิลงในเครื่องมือ spidermonkey สนับสนุนการแปลงที่หลากหลายจากค่า js ไปยังวัตถุ. net บางคนรวมถึงผู้ได้รับมอบหมายและกิจกรรม

แค่บอกว่ามันอาจจะคุ้มค่าที่จะตรวจสอบในตอนนี้ว่ามันมีการพัฒนาที่มั่นคงอยู่ :) ฉันทำ repo SVN ให้ทันสมัยอยู่เสมอด้วยการแก้ไขข้อบกพร่องและคุณสมบัติใหม่ ไฟล์โซลูชันซอร์สและโปรเจ็กต์ถูกกำหนดคอนฟิกให้สร้างเมื่อดาวน์โหลดสำเร็จ หากมีปัญหาในการใช้งานอย่าลังเลที่จะเปิดการสนทนา

ฉันเข้าใจถึงความปรารถนาที่จะมีโซลูชันจาวาสคริปต์ที่ได้รับการจัดการ แต่จากจาวาสคริปต์ที่มีการจัดการทั้งหมดที่ฉันเคยใช้พวกเขาทั้งหมดขาดคุณสมบัติที่สำคัญบางอย่างที่ช่วยให้พวกเขามีประสิทธิภาพและใช้งานง่าย ฉันเองก็กำลังรอ IronJS อยู่เล็กน้อย ในขณะที่ฉันรอฉันสนุกกับการเล่นกับ spidermonkey-dotnet =)

โครงการ spidermonkey-dotnet และหน้าดาวน์โหลด

แก้ไข: สร้างหน้าเอกสารวิกิเอกสารช่วงบ่ายนี้


1

ลองReoScriptล่าม JavaScript แบบโอเพ่นซอร์สใน C #

ReoScript ทำให้แอปพลิเคชันของคุณสามารถเรียกใช้ JavaScript มันมีความหลากหลายของมีเธนส่วนขยายเช่น SetVariable, ส่วนขยายฟังก์ชั่น, ใช้ CLR Type, .Net Event Binding และอื่น ๆ

สวัสดีชาวโลก:

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

และนี่คือตัวอย่างของสคริปต์ที่สร้าง winform และแสดงมัน

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

ใช้ JSCRIPT.NET เพื่อรับไลบรารี (dll) ของ js จากนั้นอ้างอิง dll นี้ในแอปพลิเคชัน. NET ของคุณและคุณอยู่ที่นั่น ทำ!



0

V8.NETเป็นเด็กใหม่ในบล็อก (ณ เดือนเมษายน 2013) ที่ยิ่งห่อหุ้มฟังก์ชันการทำงานของเครื่องยนต์ V8 ช่วยให้สามารถควบคุมการนำไปปฏิบัติได้มากขึ้น


-5

ตอนนี้เป็นไปได้ด้วยASP.Net MVC4 Razorโปรแกรมดู รหัสจะเป็นดังนี้:

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

และRazorไม่ได้มีไว้สำหรับ MVC4 หรือเว็บแอปพลิเคชันอื่นเท่านั้นและคุณสามารถใช้ในแอปพลิเคชันเดสก์ท็อปออฟไลน์ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.