C# アセンブリ内から JavaScript を実行する
-
09-06-2019 - |
質問
C# アセンブリ内から JavaScript コードを実行し、JavaScript コードの結果を呼び出し元の C# コードに返したいと考えています。
やろうとしないことを定義する方が簡単です。
コードビハインドから Web ページ上の JavaScript 関数を呼び出そうとしているわけではありません。
WebBrowser コントロールを読み込もうとしているわけではありません。
JavaScript にサーバーへの AJAX 呼び出しを実行させたくありません。
私がやりたいのは、JavaScript で単体テストを作成し、単体テストで JSON を出力させることです。プレーンテキストでも問題ありません。次に、JS を含むファイルをロードし、JS 単体テストを実行し、結果をスクラップ/ロードし、ビルド後のタスク中に詳細を含む合格/失敗を返すことができる汎用の C# クラス/実行可能ファイルを用意したいと考えています。
古い ActiveX ScriptControl を使用すれば可能だと思いますが、SilverLight、DLR、またはまだ出荷されていないものを使用せずにこれを行う .NET の方法があるはずだと思います。何かアイデアがある人はいますか?
アップデート: ブラッド・エイブラムスのブログより
namespace Microsoft.JScript.Vsa
{
[Obsolete("There is no replacement for this feature. " +
"Please see the ICodeCompiler documentation for additional help. " +
"http://go.microsoft.com/fwlink/?linkid=14202")]
説明:JSUnit フレームワークを使用して JavaScript で記述された JavaScript 関数の単体テストがあります。現在、ビルド プロセス中に、Web ページを手動でロードし、ボタンをクリックして、すべての JavaScript 単体テストに合格することを確認する必要があります。自動化された C# 単体テストの実行時にビルド後のプロセス中にテストを実行し、C# 単体テストと同時に成功/失敗をレポートし、ビルドが完了したかどうかの指標として使用できるようにしたいと考えています。は壊れてます。
解決
JSUnit サーバーを使用して Nant 内から JSUnit を実行できます。JSUnit は Java で書かれており、Nant タスクはありませんが、コマンド プロンプトから実行できます。結果は XML として記録され、ビルド レポートと統合できます。プロセス。これは Nunit の結果の一部ではなく、追加のレポートになります。これらのテストのいずれかが失敗すると、ビルドは失敗します。私たちは CC.Net を使用してまさにそれを行っています。
他のヒント
コードは一目瞭然なので、そのまま投稿します。
<add assembly="Microsoft.Vsa, Version=8.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/></assemblies>
using Microsoft.JScript;
public class MyClass {
public static Microsoft.JScript.Vsa.VsaEngine Engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
public static object EvaluateScript(string script)
{
object Result = null;
try
{
Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
}
catch (Exception ex)
{
return ex.Message;
}
return Result;
}
public void MyMethod() {
string myscript = ...;
object myresult = EvaluateScript(myscript);
}
}
Microsoft Javascript エンジンを使用して、 C# からの JavaScript コードの評価
アップデート:これは VS 2008 の時点で廃止されました
現時点では、これを行う .NET 固有の方法はわかりません...まあ、JScript.NET はまだありますが、それは実行する必要があるどの JS ともおそらく互換性がありません :)
明らかに、将来は DLR 用の .NET JScript 実装になるでしょう...いつか(できれば)。
そのため、おそらく古い ActiveX JScript エンジンを実行したままになりますが、.NET から実行することは確かに可能です (私は過去に実行しましたが、少し見苦しい面があります!)。
ブラウザのコンテキストでコードを実行していない場合、なぜテストを Javascript で記述する必要があるのでしょうか?ここで達成しようとしていることの全体像を理解するのは困難です。