JavaScriptエンジンを.NETに埋め込む[終了]


216

誰かがjsエンジンを.net環境に組み込み、実際に統合しようとしたことがあるかどうか疑問に思います。私が見つけて(後に実際に使用することができLOT SpiderMonkeyの-DOTNETのプロジェクトそれはかなり古いとかなり完成していないことから、痛みと労力の)。この分野での経験がある人はいますか?SquirrelFish、V8などのエンジン。

MozillaのSpidermonkey(コアASP.NETアプリケーション内のカスタムコンポーネント用のRailsのようなミニフレームワークに使用する)に満足しているわけではありませんが、オプションを使用してさらに調査したいと思っています。コマンドラインソリューションは私が必要とするものではありません。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 :)

明確にするために- サーバー側のjavascriptでアプリケーション自体を実際にプログラムしようとしているのではありません。これは、カスタムユーザーサブアプリケーションを記述するためにのみ使用されます(ある種のDSLと見なすことができます)。C#よりも通常の人がjsでプログラミングできるようにする方がはるかに簡単(かつ安全)です。

回答:


98

JavaScript .NETを試してください。GitHubでホストされています。もともとはCodePlexでホストされていました

プロジェクトディスカッション:http : //javascriptdotnet.codeplex.com/discussions

Google V8を実装しています。.NETコードからJavaScriptを直接コンパイルして実行し、JavaScriptコードで使用するCLIオブジェクトを提供することもできます。JavaScriptからネイティブコードを生成します。


+1。シンプルで、うまく機能しているようです。
JCイナシオ2011年

6
これはプロジェクトのディスカッション掲示板で無効になっているという主張があります。基本的な例を超えたドキュメントは不十分であり、スクリプトでJavaScriptイベントハンドラーを.Netイベントに追加するのに苦労しています。
アランマクドナルド

6
Noesis(元の開発会社)はプロジェクトへの関心を失いましたが、最終的にはコミュニティを管理することにしました。その結果、今では多くのバグ修正を含む新しいリリースがあります。残念ながら、.NetからのJavaScriptコールバックはまだサポートされていません。
Oliver Bock

将来のためのもう一つの注意:Nugetパッケージはどういうわけか失敗しているようです...パッケージをインストールするとき、それは現在、「ちょうど動く」わけではありません。
Chris Pfohl

3
javascriptdotnetは機能していないので、代わりにClearScriptの使用を検討してください(この回答を参照)
JB。モニカと。

86

オープンソースのJavaScriptインタープリターであるJint(http://jint.codeplex.com)は、まさにあなたが求めていることを行います。

編集:
プロジェクトは完全に書き直され、現在Githubのhttps://github.com/sebastienros/jintでホストされています。


6
DLR上に構築された別の可能性:.NETのRemObjects スクリプト remobjects.com/script.aspx blogs.remobjects.com/blogs/ck/2010/02/23/p1175
aprilchild

Delphi Prism / Oxygenで書かれていてソースコードとして提供されているので、前述の製品のライセンスを購入していない場合はそれほど役に立ちません。私が間違っている?バイナリ形式のバージョンがある場合は、試してみたいと思います。
Andrew Savinykh 2010

2
RemObjectsスクリプトは正しいOxygeneで記述されていますが、実際にそれを使用するためにOxygeneライセンスは必要ありません。1つはremobjects.com/freeからバイナリインストーラーを取得でき、もう1つは無料のOxygeneコマンドラインコンパイラを入手できるソースから自分で再構築する必要がありました。.NEtプラットフォームの大きな利点の1つは、結局のところ、言語の独立性です。ライブラリがどの言語で書かれているかは関係ありません。
marc hoffman 2011

1
2011年の最後のリリース...ジュラシックはより良いようです。
ロマン・スターコフ2014

3
実際に2014年に最後のリリース:github.com/sebastienros/jint
MSFT -セバスチャン・Rosの

54

GitHubでホストされ、Ms-Plライセンスで公開されているMicrosoft ClearScriptにも興味があるかもしれません。

私はマイクロソフトのファンではありませんが、V8サポートがJavascript.Netとほぼ同じ機能を持っていることを認めなければなりません。さらに重要なのは、プロジェクトがまだ維持されていることです。私に関する限り、デリゲートのサポートはSpidermonkey-dotnetよりもうまく機能します。

ps:JScriptとVBScriptもサポートしていますが、この古いものには興味がありませんでした。

PS:.NET 4.0および4.5以降と互換性があります。


3
+1私はこのプロジェクトにまったく気づいていませんでした。有望なようで、同じことをしようとしている他のほとんどのプロジェクトのように、プロジェクトが死なないことを願っています。
Peter

Windows.JScriptエンジンを使用したClearScriptで私が見つけた1つの違いは、.netオブジェクトが大文字と小文字を区別するようになったことです。以前のScriptControlオブジェクトは問題ではありませんでした。
Brain2000

ClearScriptに関する私の問題は次のとおりです。実行すると、dllが不足しているというメッセージが表示されます。次に、追加のビジュアルスタジオコンポーネントをインストールするように求められます。コードを実行する管理者権限がないこと以外は問題ありません。それが完全にdllに含まれているならそれは素晴らしいです。
TatiOverflow 2017

38

ジュラシックをチェックインする人もいます:

http://jurassic.codeplex.com/

編集:これはgithubに移動しました(そして一見アクティブに見えます)

https://github.com/paulbartrum/jurassic


3
これは、(f.ex。V8エンジンを使用する代わりに)ネイティブ.NETコードの両方を備えた数少ないプロジェクトの1つであり、まだサポートされているようです(Ecmascript.net、jscript.net、および他の多くのプロジェクトは、デッド)。+1とリンクをありがとう!
atlaste 2013年

2
これらの回答にリストされているすべての単一のプロジェクトをチェックアウトした後、私はジュラシックに家に帰りました。それはまだアクティブに維持されている2つまたは3つのうちの1つであり、真のJSであり、高度にテストされており、純粋な.NETです。
ローマスターコフ2014

ジュラシックのサポートを追加します。また、実行コンテキストの実行状態をシリアル化する機能もあります。つまり、JavaScriptランタイム、変数などすべてを文字通り永続化できます。場合によっては非常に便利な機能です。
ジェロームハルトム

こんにちはわさび、実行コンテキストの実行状態をシリアル化する方法について何も見つかりませんでした。どのようにしてそれを達成しましたか?
ヘニング


7

あなたが何をしようとしているのかはまだ不明だと思いますが、JScript.NETは調査する価値があるかもしれませんが、Managed JScriptはニーズに適しているようです(JScript.NETよりもJavaScriptに似ています)。 。

個人的には、どういうわけかV8を統合するのはかっこいいと思いましたが、ソースコードをダウンロードすることを忘れていませんでした。私が実際にそれを使って何かをする時間があればいいのに。


実際、Managed JScriptは私のニーズに最も近いものです。それがSilverlightにあることは知っていましたが、リリースされたことを知りませんでした。JScript.NETはオプションではありません。ユーザーに.NETスタック全体へのアクセスを許可したくありません。アプリケーションに使用できるコア組み込みオブジェクトがいくつか必要です。
aprilchild、2008年

17
それは2009年であり、マネージドJScriptは現在死んでいます。
アレクサンダーアブラモフ

5

言語に問題がない場合(サンドボックス化されたスクリプト言語)、LUA for .NETがあります。.NETフレームワークのSilverlightバージョンもサンドボックス化されています。


5

バージョン0.3.1のcodeplex(http://javascriptdotnet.codeplex.com/)でJavascript .NETを見てください。かなり興味深い新機能がいくつかあります。

サンプルコードをチェックしてください:

// 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に渡して、JavaScriptからEmployeeオブジェクトを操作できますか?
Joy George Kunjikkuru、2015年


5

代わりに、はるかに簡単な解決策を考え出しました。

.dllJavaScriptを使用してファイルを作成し、VS2013開発者のコ​​マンドプロンプトで使用できるJavaScriptコンパイラを使用してファイルをコンパイルしました。

取得したら.dll、それを\Supportフォルダーに追加し、Javascriptステートメントを評価する必要があるプロジェクトで参照します。

を作成するための詳細な手順.dll

  1. 次の内容のみを含むファイルをメモ帳で作成します。

    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 Script for .Netを試しました

構文のvar a=A.createA();代わりにJavaScriptから静的ファクトリ()を使用する必要がありましたが、機能しvar a=new A()ます。(ExposeType関数は静的データのみを公開します!)ドキュメントはそれほど多くなく、ソースはDelphi Prismで記述されています。これは、私やRedGateリフレクターではかなり珍しいことです。

だから:使いやすく設定も簡単ですが、高度なシナリオにはあまり役立ちません。

また、単にアセンブリをディレクトリにドロップするのではなく、何かをインストールする必要があることは、私にとってネガティブです...


2

Microsoftが文書化してスクリプト拡張性を追加する方法は、IActiveScriptです。Anyt .NETアプリ内からIActiveScriptを使用して、スクリプトロジックを呼び出すことができます。ロジックは、スクリプトコンテキストに配置した.NETオブジェクトでパーティできます。

この答えは、それを行うアプリケーションをコードで提供します:


2

ここで利用可能なC#のActiveXスクリプトエンジンホストの実装があります:C#によるJSの解析と実行

ネイティブの32ビットまたは64ビットプロセスで、C#から直接Javascript(またはVBScript)を使用できます。完全なソースは、約500行のC#コードです。インストールされているJScript(またはVBScript)エンジンDLLに暗黙的に依存しているだけです。

たとえば、次のコード:

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

1.66666666666667が表示されます



1

私はすべての主要なオープンソースJSエンジン(JavaScriptCore、SpiderMonkey、V8、およびKJS)が埋め込みAPIを提供していると思います。私が実際に直接知っているのは、純粋なC APIを提供するJavaScriptCore(SquirrelFishが常駐するJSエンジンの名前)だけです。メモリが役立つ場合(私が.NETを使用してからしばらく経っています).NETは、C APIでのリンクをかなりサポートしています。

正直なところ、他のエンジンのAPIがどのようなものかはわかりませんが、それらすべてがAPIを提供していることは知っています。

そうは言っても、JSCが実際にOSに同梱されているのはJSCだけですが、そのOSはMacOSであるため、他のすべてのエンジンではアプリに含める必要があるため、目的に応じてJScript.NETが最適な場合があります。


2
はい、すべての主要なエンジンは一般に埋め込み可能ですが、障害が多すぎます。埋め込みガイドを勉強し、C(++)APIを学びます。統合が完了するまで、もう少し仕事ができることを期待していました。JScript.NETは使用できません。実際のコードはインターネットユーザーによって記述および実行されます。
aprilchild、2008年

1

私は古いスレッドを開いていることを知っていますが、smnet(spidermonkey-dotnet)で多くの作業を行いました。近年。開発の主な焦点は、スパイダーモンキーエンジンへの.netオブジェクトのシームレスな埋め込みです。js値から.netオブジェクトへのさまざまな変換をサポートしています。代表やイベントを含むそれらのいくつか。

ただ着実に発展していることを今チェックする価値があるかもしれないとだけ言ってください:) バグの修正と新機能により、SVNリポジトリを最新の状態に保ちます。ソースおよびプロジェクトソリューションファイルは、ダウンロード時に正常にビルドされるように構成されています。使用に問題がある場合は、気軽にディスカッションを開いてください。

私はマネージドJavaScriptソリューションを使用したいという欲求を理解していますが、私が使用したすべてのマネージドJavaScriptのうち、堅牢で扱いやすいようにするのに役立ついくつかの主要な機能がすべて不足しています。私自身、IronJSが少し成熟するのを待っています。待っている間、spidermonkey-dotnet =)で遊んでいます。

spidermonkey-dotnetプロジェクトとダウンロードページ

編集:今日の午後、ドキュメントWikiページを作成しました。


1

C#で実装されたオープンソースのJavaScriptインタープリターであるReoScriptを試してください。

ReoScriptは、アプリケーションがJavaScriptを実行できるようにします。これには、SetVariable、Function Extension、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を使用して、jsのライブラリ(dll)を取得します。次に、このdllを.NETアプリケーションで参照すると、そこにいるだけです。できた!



0

V8.NETは、ネイティブV8エンジン機能をより緊密にラップする(2013年4月の時点で)ブロックの新しい子供です。これにより、実装をより詳細に制御できます。


-5

ASP.Net MVC4 RazorViewエンジンで可能になりました。コードは次のようになります:

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

そしてRazorMVC4または別のWebアプリケーションのためだけでなく、オフラインデスクトップアプリケーションで使用することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.