8

基本的な TypeScript コードをコンパイルするために、 ClearScriptを使用してTypeScriptコンパイラをロードしようとしました。

残念ながら、TypeScript コンパイラ ソースを実行すると、次のエラーが発生します。

「WScript」は未定義です

これは私が使用したLINQPadプログラムです。ClearScript dll とTypeScript コンパイラ ファイルを .linq プログラムと一緒に配置します。

void Main()
{
    using (var js = new Microsoft.ClearScript.Windows.JScriptEngine(Microsoft.ClearScript.Windows.WindowsScriptEngineFlags.DisableSourceManagement))
    {
        var typeScriptSource = File.ReadAllText(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), "tsc.js"));
        js.Execute(typeScriptSource);
        const string typeScriptCode = @"
            class Greeter {
                greeting: string;
                constructor(message: string) {
                    this.greeting = message;
                }
                greet() {
                    return ""Hello, "" + this.greeting;
                }
            }
            function test()
            {
                var greeter = Greeter(""world"");
                return greeter.greet();
            }
        ";
        js.Script.TypeScript.Compile(typeScriptCode);

        object result = js.Script.test();
        result.Dump();
    }
}

#region Copy ClearScript to correct location

static UserQuery()
{
    foreach (var filename in new[] { "ClearScriptV8-32.dll", "ClearScriptV8-64.dll", "v8-ia32.dll", "v8-x64.dll" })
    {
        try
        {
            string sourcePath = Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), filename);
            string targetPath = Path.Combine(Path.GetDirectoryName(typeof(Util).Assembly.Location), filename);

            File.Copy(sourcePath, targetPath, true);
        }
        catch (IOException ex)
        {
            unchecked
            {
                const int fileInUseHresult = (int)0x80070020;
                if (ex.HResult != fileInUseHresult)
                    throw;
            }
        }
    }
}

#endregion

エラーは次の行で発生します。

js.Execute(typeScriptSource);

すべてを含む .zip ファイルを作成しました。.linq ファイルを読み込んで実験するには、LINQPadが必要です。ClearScript dll は変更されていないソースから作成されていますが、私を信用しない場合は、自分でそれらを再現できるはずです (持っていない場合)。

ここから入手できます: SO19023498.zip への Dropbox リンク

私が試したこと:

  1. 最初にこのコードを実行してみました:

    var WScript = new ActiveXObject("WSH.WScript");
    

    これにより、次のエラーのみが生成されました。Automation server can't create object

    WSH.WScriptHKEY_CLASSES_ROOT の下のレジストリに表示されなかったので、それが原因である可能性があります。

  2. .NET からオブジェクトを作成し、それをスクリプト コンテキストに設定する方法を見つけようとしましたが、適切な場所を探していないようです。

4

3 に答える 3

5

これは、現在のバージョンの を使用したスケルトン サンプルですtypescript.js。TypeScript API はリバース エンジニアリングされていることに注意してください。私の知る限り、唯一の公式インターフェースはtscコマンドラインにあります。また、これはエラー処理やレポートを行わない最小限のサンプルであることにも注意してください。

using System;
using System.IO;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;

namespace Test
{
    public class TypeScriptCompiler
    {
        private readonly dynamic _compiler;
        private readonly dynamic _snapshot;
        private readonly dynamic _ioHost;

        public TypeScriptCompiler(ScriptEngine engine)
        {
            engine.Evaluate(File.ReadAllText("typescript.js"));
            _compiler = engine.Evaluate("new TypeScript.TypeScriptCompiler");
            _snapshot = engine.Script.TypeScript.ScriptSnapshot;
            _ioHost = engine.Evaluate(@"({
                writeFile: function (path, contents) { this.output = contents; }
            })");
        }

        public string Compile(string code)
        {
            _compiler.addSourceUnit("foo.ts", _snapshot.fromString(code));
            _compiler.pullTypeCheck();
            _compiler.emitUnit("foo.ts", _ioHost);
            return _ioHost.output;
        }
    }

    public static class TestApplication
    {
        public static void Main()
        {
            using (var engine = new V8ScriptEngine())
            {
                var compiler = new TypeScriptCompiler(engine);
                Console.WriteLine(compiler.Compile("class Foo<T> {}"));
            }
        }
    }
}
于 2013-11-05T12:09:04.263 に答える