VB.NETにJavaScriptを取り込んでVB.NET上で動作させるようにするには
どうすれば良いでしょうか?
「JavaScriptを取り込んで」という言葉の意味がわかりませんが、
案1) JScript.NET で DLLを作成し、それを動的に呼び出す
案2) Microsoft ScriptControlを使って、JScriptを実行させる
のような事ならば、多分可能かと。
案1で書かれているJScriptをDLLにすると書かれていますが、JScriptのソースの記述をどのように記載すればいいでしょうか?
一度もDLLのソースを打ったことがないんです。
案2で書かれているMicrosoft ScriptControlの使い方が分かりません。
VB.NETにそのソースのデータを引き渡す記述はどのように記述すればいいのでしょうか?
私はまだ、質問の意味自体を理解出来ていませんので、最初の
『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)を御覧下さい。
「JavaScript」と「JScript」は別の言語だったのですか?
同じ言語だと思っていました。
私の質問の方はJavaScriptのほうです。
説明している内容はJavaScriptのソースをVB.NET内に取り込み
VB.NET内で動作させる方法を探しています。
> 「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内で動作させる」事にはならないでしょうから、
残念ながら、私ではお役に立てそうにないです…。
たとえば
<script language="javascript">
<!--
a=10;
-->
</script>
というような形式はVB.NETに取り込みVB.NET上で処理させることが出来ますか?(VB.NETの関数に混ぜて使用)
上のソースは見本なのでソースは適当に書いておきました。
本来はこのようなソースは使いませんから、誤解しないでください。
>(VB.NETの関数に混ぜて使用)
VB.NETのソース内に
HTMLタグで囲まれたJavascriptコードをインラインで記述して、
VB.NETソースと一緒にコンパイルして実行したいということでしょうか?
マイクロソフトが対応しない限り不可能ですし、
おそらく対応することはないでしょう。
それとももしかすると、
HTMLファイル内に書かれたJavascriptコードを
VB.NETで読み込み、解釈して実行したい、ということでしょうか?
いいかえれば、一種のJavascriptエンジン(インタプリタ)を
VB.NETで作りたいと?
可能か不可能か、ということなら可能ですが、
数ヶ月〜数年の手間がかかったあげく
速度的に不満足なものになりそうな・・・。
なぜそういうことをしたいのか、
理由や状況を述べたほうが
建設的な意見が聞けると思いますが・・・。
VB.NETのプログラムとJavaScriptのプログラムを比べた場合、
もしかしたら、JavaScriptの方が動作速度が速と思うかな?
と思いますけど、どうでしょうか?
やはり、VB.NETの方が速いでしょうか?(CPU使用率も少ないですか?)
初心者なのでどうしても分かりませので教えてください。
お願いします。
曖昧な回答ですけど、言語の基幹部分の速度は、おそらく、さほど変わらないのでは。
想像上で比較するなら、処理能力が貧弱な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.の実行速度は、別言語製アプリの出来に左右されるので、何とも言えない。
という結果になりそうな予感がします。ま、実際の比較結果までは保証しかねますが。
VB.NETで実行させたほうがいいということですね。
親切に教えくださってありがとうございました。