C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ScriptControlでJScriptからの戻り値取得


(過去ログ 118 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■69523 / inTopicNo.1)  ScriptControlでJScriptからの戻り値取得
  
□投稿者/ B.B (1回)-(2014/01/06(Mon) 13:56:12)

分類:[C#] 

C#(Visual Studio Express 2012、.NET Framework 4.5、Windows7 64bit)を使用

ScriptControlでJScriptの関数を実行してオブジェクトリテラルの値を取得したいのです。
C#側でdynamicで受け取れば、キーのプロパティ値を使って値を表示できるのですが、
キーのプロパティ値がわからない場合にどのようにすればいいかがわかりません。
受け取った値をC#側で調べたりしたいのです。
 
インターフェースを実装するのかとも思いますが、実装の仕方が全くわかりませんし、
そのアプローチでいいのかさえわかりません。
また私の使っている用語が正しくないかもしれませんが、ご容赦ください。

よろしくお願いいたします。

---- C#ソースコード (参照設定追加:Microsoft Script Control 1.0) ----
using MSScriptControl;
using System;
using System.IO;
using System.Text;

namespace ConsoleApplication1
{
  class Program
  {
  static void Main(string[] args)
  {
      IScriptControl scriptCtl = new ScriptControl();
      scriptCtl.Language = "JScript";
      string fileName = @"C:\test.js";
      var enc = Encoding.GetEncoding("utf-8");
      var sr = new StreamReader(fileName, enc);
      string text = sr.ReadToEnd();
      scriptCtl.AddCode(text);
      dynamic ret = scriptCtl.Eval("hoge()");
      Console.Write("{0}:{1}", ret.red, ret.yellow);
  }
  }
}

---- JScriptソースコード(C:\test.js) ----
function hoge(){
  var fruit = {"red":"apple", "yellow":"banana"};
 return fruit;
}

引用返信 編集キー/
■69525 / inTopicNo.2)  Re[1]: ScriptControlでJScriptからの戻り値取得
□投稿者/ 魔界の仮面弁士 (481回)-(2014/01/06(Mon) 16:53:02)
No69523 (B.B さん) に返信
> キーのプロパティ値がわからない場合にどのようにすればいいかがわかりません。

こんな方法でどうでしょう。


using System;

namespace ConsoleApplication1
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            dynamic sc = Activator.CreateInstance(Type.GetTypeFromProgID("ScriptControl"));
            sc.Language = "JScript";
            sc.AddCode(@"
                function hoge(){
                  var fruit = {'red':'apple', 'yellow':'banana'};
                 return fruit;
                }
                function invoker(o,c){return o[c];}
                function getMembers(o){
                  var a = new ActiveXObject('System.Collections.ArrayList');
                  for(var k in o) { a.Add(k); }
                  return a;
                }
            ");

            dynamic ret = sc.Eval("hoge()");
            Console.WriteLine("\r\n直接指定");
            Console.WriteLine("{0}:{1}", ret.red, ret.yellow);

            Console.WriteLine("\r\nJScript経由");
            dynamic invoker = sc.Eval("invoker");
            Console.WriteLine("{0}:{1}", invoker(ret, "red"), invoker(ret, "yellow"));
            Console.WriteLine("{0}:{1}", sc.Run("invoker", ret, "red"), sc.Run("invoker", ret, "yellow"));

            Console.WriteLine("\r\n連想配列の列挙");
            foreach (var key in sc.Run("getMembers", ret))
            {
                Console.WriteLine("Key={0}, Value={1}", key, invoker(ret, key));
            }

        }
    }
}

引用返信 編集キー/
■69527 / inTopicNo.3)  Re[2]: ScriptControlでJScriptからの戻り値取得
□投稿者/ 魔界の仮面弁士 (483回)-(2014/01/06(Mon) 18:11:52)
No69525 (魔界の仮面弁士) に追記
>>キーのプロパティ値がわからない場合にどのようにすればいいかがわかりません。
> こんな方法でどうでしょう。

もっと簡単に書けました。
(IDispatchEx を用意する必要があるのかと思ってた…)


using System;
using System.Reflection;
using System.Runtime.InteropServices.Expando;

namespace ConsoleApplication1
{
    class Program
    {
        [STAThread]
        static void Main()
        {
  
            dynamic sc = Activator.CreateInstance(Type.GetTypeFromProgID("ScriptControl"));
            sc.Language = "JScript";
            sc.AddCode(@"
                function hoge(){
                  var fruit = {'red':'apple', 'yellow':'banana'};
                 return fruit;
                }
            ");

            dynamic ret = sc.Eval("hoge()");
            //Console.WriteLine("{0}:{1}", ret.red, ret.yellow);

            var props = ((IExpando)ret).GetProperties(BindingFlags.Default);
            foreach (var p in props)
            {
                Console.WriteLine("Key={0}, Value={1}", p.Name, p.GetValue(ret));
            }
            
        }
    }
}

引用返信 編集キー/
■69528 / inTopicNo.4)  Re[3]: ScriptControlでJScriptからの戻り値取得
□投稿者/ B.B (2回)-(2014/01/06(Mon) 21:27:31)
No69527 (魔界の仮面弁士 さん) に返信

> もっと簡単に書けました。

ずばりです。素晴らしすぎです。
まさに 'foreach' で回したかったのです。

とにかく動くソースをと思い 'dynamic' を使用しましたが、
それが何かに置き換わるものとばかり思っていました。

実際のコードでは 'AddCode' も使用しているのですが、
VB.NETのソースを参考にしていたので、コードを1行ずつ追加していましたが
'@' を使えばよいのですね。

プログラミングは趣味でやっているのですが、
覚えることがいっぱいあって面白いです。
ありがとうございました。
解決済み
引用返信 編集キー/
■69530 / inTopicNo.5)  Re[4]: ScriptControlでJScriptからの戻り値取得
□投稿者/ 魔界の仮面弁士 (485回)-(2014/01/06(Mon) 21:49:48)
No69528 (B.B さん) に返信
> VB.NETのソースを参考にしていたので、コードを1行ずつ追加していましたが
> '@' を使えばよいのですね。

VBで改行入り文字列を作る場合は、XMLリテラルで代用する手法が使えます。
蛇足までに。


Imports System.Runtime.InteropServices.Expando
Imports System.Reflection

Module Module1

    Sub Main()
        Dim script = _
            <script language="JScript">
                function hoge(){
                    var fruit = {"red":"apple", "yellow":"banana"};
                    return fruit;
                }
            </script>

        Dim sc = CreateObject("ScriptControl")
        sc.Language = script.@language
        sc.AddCode(script.Value)

        Dim ret = sc.Eval("hoge()")
        Dim keys() As String = DirectCast(ret, IExpando).GetProperties( _
                BindingFlags.Default).Select(Function(p) p.Name).ToArray()

        For Each key In keys
            Console.WriteLine("Key={0}, Value={1}", key, CallByName(ret, key, CallType.Get))
        Next
    End Sub

End Module

解決済み
引用返信 編集キー/
■69531 / inTopicNo.6)  Re[5]: ScriptControlでJScriptからの戻り値取得
□投稿者/ B.B (3回)-(2014/01/07(Tue) 00:46:59)
2014/01/07(Tue) 00:49:31 編集(投稿者)

No69530 (魔界の仮面弁士 さん) に返信

> VBで改行入り文字列を作る場合は、XMLリテラルで代用する手法が使えます。

感服いたしました。

このトピックを見た人がVBではC#のように逐語的文字列リテラルを
作れないと思うのと代替案があるのを知るのでは雲泥の差です。
自分は作れないと思っていたが、知らなかっただけでした。

.NETになってから、一つの言語で解決したいという呪縛から解放され、
かたくなに拒否していた英語のサイトも見るようにもなりました。

英語のサイトは'Microsoft Translator API'の存在が大きいです。
検索するとサンプルも見つかりますし、何よりも
ライブラリを図書館と訳したりせず、プログラムサイトの翻訳にもってこいです。
調べ物をする程度なら無料でいけますし。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -