VB.NETにJavaScriptを取り込むには?

解決


マグ  2004-06-04 21:21:12  No: 113725  IP: [192.*.*.*]

VB.NETにJavaScriptを取り込んでVB.NET上で動作させるようにするには
どうすれば良いでしょうか?

編集 削除
魔界の仮面弁士  2004-06-05 00:33:54  No: 113726  IP: [192.*.*.*]

「JavaScriptを取り込んで」という言葉の意味がわかりませんが、

案1) JScript.NET で DLLを作成し、それを動的に呼び出す
案2) Microsoft ScriptControlを使って、JScriptを実行させる

のような事ならば、多分可能かと。

編集 削除
マグ  2004-06-05 08:03:35  No: 113727  IP: [192.*.*.*]

案1で書かれているJScriptをDLLにすると書かれていますが、JScriptのソースの記述をどのように記載すればいいでしょうか?
一度もDLLのソースを打ったことがないんです。

案2で書かれているMicrosoft ScriptControlの使い方が分かりません。
VB.NETにそのソースのデータを引き渡す記述はどのように記述すればいいのでしょうか?

編集 削除
魔界の仮面弁士  2004-06-06 00:55:30  No: 113728  IP: [192.*.*.*]

私はまだ、質問の意味自体を理解出来ていませんので、最初の
『JavaScriptを取り込む』という言葉の意味についても
答えていただけると、回答がしやすいです。


それと、最初の質問では「JavaScript」を対象にしていましたが、
私の回答(案2)では、「JScript」を対象にしています。

「JavaScript」と「JScript」は、名前は似ていますが、実際には別の言語です。
マグさんが実際に使いたいスクリプトの文法は、JavaScriptの物なのでしょうか?
それとも、JScriptの物なのでしょうか?
(もしJavaScriptの方だとしたら、私の回答では解決できません…)


> JScriptのソース
案1で書いたのはJScriptですらなく、「JScript.NET」なのですが、
それでも構いませんか? JScript.NETという言語は、JScriptの拡張ですから、
JScriptの文法で書かれたコードは、JScript.NET環境でも動作しますが、逆に、
JScript.NETの文法で書かれたコードは、JScript向けの環境では動作しません。

> DLLにすると書かれていますが
JScript.NETソースのコンパイル時に、『/t:library』オプションを付加するだけで、DLLが作成されます。

例えば………

//======= C:\TEST.JS =======
import System.Windows.Forms
class Test
{
  static function Msg(arg : System.String)
  {
    System.Windows.Forms.MessageBox.Show(arg)
  }
}

というソースファイル(C:\TEST.JS)を作成した後、
「Visual Studio .NET コマンド プロンプト」から、
--------
 C:
 CD\
 JSC /t:library C:\TEST.JS
--------
というコマンドを実行すると、C:\TEST.DLL が作成されます。

VB.NETから利用するときは、参照設定で[Microsoft.JScript]コンポーネントと、
今作成した「C:\TEST.DLL」の2つを参照設定しておけば、
    Test.Msg("実験")
のようにして、JScript.NET製DLLのメソッドを呼び出す事ができます。


もし、参照設定を事前に行いたく無いのであれば、
   Dim M As System.Reflection.MethodInfo = System.Reflection.Assembly.LoadFrom("C:\TEST.DLL").GetType("Test").GetMethod("Msg")
   M.Invoke(M, New Object() {"テスト"})
のように、動的にDLLをロードして呼び出す事もできます。


> 案2で書かれているMicrosoft ScriptControlの使い方が分かりません。
msscript.ocx がインストール済みである事が前提条件ですが、
例えば、
  Dim Code As String
  Code = "function Calc()" & vbCrLf
  Code += "{" & vbCrLf
  Code += "  return 1 + 2;" & vbCrLf
  Code += "}" & vbCrLf
のような「JScriptの文法で書かれたコード文字列」を実行するなら、
  Dim SC As Object
  SC = CreateObject("ScriptControl")
  CallByName(SC, "Language", CallType.Let, "JScript")
  CallByName(SC, "AddCode", CallType.Method, Code)

  Dim Ret As Object
  Ret = CallByName(SC, "Eval", CallType.Method, "Calc()")

  MessageBox.Show(Ret.ToString())
のような感じです。
他にも呼び出し方はありますが、詳細はヘルプ(MSSCRIPT.HLP)を御覧下さい。

編集 削除
マグ  2004-06-06 13:18:05  No: 113729  IP: [192.*.*.*]

「JavaScript」と「JScript」は別の言語だったのですか?
同じ言語だと思っていました。
私の質問の方はJavaScriptのほうです。

説明している内容はJavaScriptのソースをVB.NET内に取り込み
VB.NET内で動作させる方法を探しています。

編集 削除
魔界の仮面弁士  2004-06-06 18:04:40  No: 113730  IP: [192.*.*.*]

> 「JavaScript」と「JScript」は別の言語だったのですか?
言語の歴史的な経緯から、同じ物のように扱われる事もありますが、
厳密には別物です。(良く似ていますけれどね)
http://www.interq.or.jp/student/exeal/dss/ref/jscript/about.html

そして、InternetExplorerによって実行されるのは、JScriptの方です。
たとえHTMLで<SCRIPT LANGUAGE="JavaScript">のように書かれていたとしても、
InternetExplorerは、それをJScriptの文法として認識・処理します。

JScriptとJavaScriptには、共通する部分もありますので、両対応の
コードになっているなら、先の案2などによって実行できると思いますが、
JavaScript固有のコードが含まれていた場合は、動かないでしょうね。。。


> 私の質問の方はJavaScriptのほうです。
Microsoft製品で「JavaScript(≠JScript)」の文法を正しく解釈する物は、
用意されていないかと思います。かといって、Microsoft以外の製品で、
JavaScriptを解釈でき、かつ、VB.NETから制御できるものとなると、
正直なところ、全くわからないです。

htmlファイルにして、Netscapeに渡すぐらいの事はできるかも知れませんが、
それでは、「VB.NET内で動作させる」事にはならないでしょうから、
残念ながら、私ではお役に立てそうにないです…。

編集 削除
マグ  2004-06-06 20:32:12  No: 113731  IP: [192.*.*.*]

たとえば
<script language="javascript">
<!--
a=10;
-->
</script>

というような形式はVB.NETに取り込みVB.NET上で処理させることが出来ますか?(VB.NETの関数に混ぜて使用)

上のソースは見本なのでソースは適当に書いておきました。
本来はこのようなソースは使いませんから、誤解しないでください。

編集 削除
Say  2004-06-07 01:40:55  No: 113732  IP: [192.*.*.*]

>(VB.NETの関数に混ぜて使用)
VB.NETのソース内に
HTMLタグで囲まれたJavascriptコードをインラインで記述して、
VB.NETソースと一緒にコンパイルして実行したいということでしょうか?

マイクロソフトが対応しない限り不可能ですし、
おそらく対応することはないでしょう。

それとももしかすると、
HTMLファイル内に書かれたJavascriptコードを
VB.NETで読み込み、解釈して実行したい、ということでしょうか?

いいかえれば、一種のJavascriptエンジン(インタプリタ)を
VB.NETで作りたいと?

可能か不可能か、ということなら可能ですが、
数ヶ月〜数年の手間がかかったあげく
速度的に不満足なものになりそうな・・・。


なぜそういうことをしたいのか、
理由や状況を述べたほうが
建設的な意見が聞けると思いますが・・・。

編集 削除
マグ  2004-06-07 16:37:42  No: 113733  IP: [192.*.*.*]

VB.NETのプログラムとJavaScriptのプログラムを比べた場合、
もしかしたら、JavaScriptの方が動作速度が速と思うかな?
と思いますけど、どうでしょうか?
やはり、VB.NETの方が速いでしょうか?(CPU使用率も少ないですか?)
初心者なのでどうしても分かりませので教えてください。
お願いします。

編集 削除
Dental  2004-06-07 17:45:15  No: 113734  IP: [192.*.*.*]

曖昧な回答ですけど、言語の基幹部分の速度は、おそらく、さほど変わらないのでは。

想像上で比較するなら、処理能力が貧弱なPCにおいては、JavaScriptの
スクリプトの方が軽快に動作すると予想しますが、それなりの能力を
持ったPCの場合、データ型を明示できるVB.NET製exeの方が有利でしょう。多分。


ただこれが、.NETからJavaScriptを実行させるというのであれば、話は変わるかと。

「VB.NETだけ使う」「JavaScriptだけ使う」という場合は、言語自体を
比較するだけで良いのですが、それらを組み合わせて使うなら、
「JavaScriptの呼び出しにかかるコスト」を考慮する必要があるでしょうし。


で。VB.NETからJavaScriptを実行する手法には、(実用的かどうかは度外視するなら)

1. Windows Scriptとして実装し、ScriptControl経由で実行されるようにする。
2. .NET対応言語として実装し、コンパイル後に実行されるようにする。
3. VB.NET上で動作可能なインタプリタ言語として実行されるようにする。
4. JavaScriptを処理するアプリを.NET以外で作り、それをVB.NETから起動する。

などが考えられます。どれも、JavaScriptの動作環境を自作する必要がありますけど。


そして、上記4パターンそれぞれの動作を、私なりに推測してみるなら、

1.の実行速度は、COM Interopを経由させる事になるため、VB.NET単体時よりも低速。
2.の実行速度は、共通言語ランタイム上で実行されるため、VB.NETの場合と全く同等。
3.の実行速度は、2よりも遅くなるが、1と比較した場合はどちらとも言えない。
4.の実行速度は、別言語製アプリの出来に左右されるので、何とも言えない。

という結果になりそうな予感がします。ま、実際の比較結果までは保証しかねますが。

編集 削除
マグ  2004-06-08 09:10:12  No: 113735  IP: [192.*.*.*]

VB.NETで実行させたほうがいいということですね。

親切に教えくださってありがとうございました。

編集 削除