문제

누구든지 알고 있습니까? 진짜 (i .. 증기 없음) ECMAScript의 구현은 .NET CLR/DLR? 이상적으로는 같은 것입니다 Rhino는 Java를위한 것입니다. .NET Framework / Mono Framework에서 실행되는 Rhino의 견고한 포트가 완벽합니다.

나는 언급 된 소수의 프로젝트 만 보았지만 아무것도 밝히거나 실제로 스크립트를 실행할 수 있었던 것을 보지 못했습니다. 내가 이미 알고있는 것은 다음과 같습니다.

  • MSScriptControl ActiveX Control: Afaik, 이것은 Microsoft의 마지막 실제 ECMAScript-Comportiant Idementaiton (JScript 5.7 실행)이었습니다. MSScriptControl과 통합되었지만 COM Interop 이이 질문에 대한 답변으로 간주하지 않습니다. X64는이 옵션의 킬러입니다.

  • jscript.net: 나는 실제 스크립트를 성공적으로 구문 분석 할 수 없으므로 jscript.net을 계산하지 않습니다. 폐쇄에 문제가있는 것 같습니다.

  • 관리 된 JScript: 내가 원하는 것 같지만 물에서 죽은 것 같습니다. DLR의 주요 예제 구현 이었지만 Silverlight와 함께 얽히고 2007 년 이래 우선 순위로 사라진 것 같습니다.이 상태에 대한 신용 가능한 출처는 도움이 될 것입니다.

  • myjscript: DLR의 튜토리얼 구현으로 구축되었습니다. 누구든지 이것이 구현이 얼마나 완전한 지 아는 사람이 있습니까?

  • : .NET 용 JavaScript 통역사. 아직 카레를 지원하지는 않습니다 try-catch-finally.

  • .NET 용 스크립트 리브 젝트: 여전히 작품에서 흥미로운 경쟁자. 나는 그들의 마케팅에 실제로 그것이 무엇인지에 대해 혼란스러워하지만 결국에는 적합 할 것 같습니다. 누구든지 그것에 대해 더 많이 알고 있다면 도움이 될 것입니다.

  • .NET 용 V8: 누군가가 v8을 .NET으로 포팅 한 경우에 좋을 것입니다. 내가 아는 한 이것에 대해서도 큰 노력이 없습니다. 링크는 관리되는 C ++ 래퍼에서 호출하는 아이디어입니다.

배경의 경우 .NET 내에서 JavaScript를 실행할 수 있기를 원합니다. 즉, 스크립트 세트를 컨텍스트로로드하고 해당 컨텍스트로 호출하고 실행 결과를 검색합니다. 현재 나는 후프를 뛰어 다니면서 번거로운 COM 인터 로프를 통해 MSScriptControl을 사용합니다. COM의 불일치로 인해 배포가 어려워지고 일관된 실행을 보장합니다.

.NET 내에서 합리적으로 복잡한 JavaScript 테스트 하네스를 실행하고 싶습니다. 이것은 사용자 매크로 또는 간단한 작은 스크립트를 만드는 것이 아닙니다. Rhino와 같은 실제 JavaScript 환경이 필요합니다. 구현이 COM이 아닌 CLR 위에 실행중인 경우 현재 문제 중 일부에 도움이됩니다.

도움이 되었습니까?

해결책

현재는 버전을 수정했습니다 ecmascript.net 내 내부 yuicompressor.net 포트 (프로젝트).

당신이 잡으면 여기에서 소스 코드, 프로젝트에 수정 된 코드를 포함 시켰으며 참조 할 수 있습니다. 이것은 .NET에서 찾은 유일한 코드 소스 인 서버 쪽을 구문 분석 할 수 있습니다.

불행히도, 나는 내가 어떻게 그것을 찾았는지 기억할 수 없습니다. 힘든 과정이었습니다. 인정해야합니다. 나는 Rhino (Java Code)에 관한 어딘가에 Mozilla Dev 페이지를 찾아서 C# .NET 구현을 찾게되었습니다.

Yui Compressor Guys가 코드 브랜치에 한 변경 사항과 동기화하기 위해 약간 수정해야했습니다. 그래서 내가 가진 수정 된 지점이 최고가 아닐 수도 있습니다. 그러나 그것은 내가 원래 Java 지점에서 가장 가까운 곳입니다.

ECMASCRIP.NET의 원래 C# 코드는 2007 년 이후로 터치되지 않았습니다 ... 최소한 다운로드 페이지의 경우.

어쩌면 이것이 도움이 될 수 있습니까 ??

HTH.

다른 팁

여전히 거의 살아 있습니다 :

  • 쥬라기 (작년에 커밋이있었습니다.)
  • (현재 풀 요청을 받고 있습니다.)

대부분 죽은 다른 프로젝트 :

미친 방법 :

  • Ikvm에 대한 코뿔소 (의견에 언급되었지만 여기에 대한 자세한 정보에 대한 링크가 있습니다.)

아무도 쥬라기를 언급하지 않았습니다 http://jurassic.codeplex.com/나는 그것이 일반적으로 얼마나 좋은지 (성능, 유용성 등) 얼마나 좋은지는 모르지만 적어도 그것은 꽤 복잡한 스크립트를 구문 분석하고 (다른 구현은 그렇지 않음) ECMAScript 5 사양을 지원합니다. 참조를 위해 여기에 링크를 추가합니다.

아무도 ClearScript를 언급하지 않았습니다 ClearScript.

구현이 아닙니다. V8, JScript 및 VBScript를 지원하는 Interop 래퍼이며 .NET 코드에서 호출 할 수있는 정말 멋진 API가 있습니다.

CodePlex 페이지의 코드 예제 :

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

// create a script engine
using (var engine = new V8ScriptEngine())
{
    // expose a host type
    engine.AddHostType("Console", typeof(Console));
    engine.Execute("Console.WriteLine('{0} is an interesting number.', Math.PI)");

    // expose a host object
    engine.AddHostObject("random", new Random());
    engine.Execute("Console.WriteLine(random.NextDouble())");

    // expose entire assemblies
    engine.AddHostObject("lib", new HostTypeCollection("mscorlib", "System.Core"));
    engine.Execute("Console.WriteLine(lib.System.DateTime.Now)");

    // create a host object from script
    engine.Execute(@"
        birthday = new lib.System.DateTime(2007, 5, 22);
        Console.WriteLine(birthday.ToLongDateString());
    ");

    // use a generic class from script
    engine.Execute(@"
        Dictionary = lib.System.Collections.Generic.Dictionary;
        dict = new Dictionary(lib.System.String, lib.System.Int32);
        dict.Add('foo', 123);
    ");

    // call a host method with an output parameter
    engine.AddHostObject("host", new HostFunctions());
    engine.Execute(@"
        intVar = host.newVar(lib.System.Int32);
        found = dict.TryGetValue('foo', intVar.out);
        Console.WriteLine('{0} {1}', found, intVar);
    ");

    // create and populate a host array
    engine.Execute(@"
        numbers = host.newArr(lib.System.Int32, 20);
        for (var i = 0; i < numbers.Length; i++) { numbers[i] = i; }
        Console.WriteLine(lib.System.String.Join(', ', numbers));
    ");

    // create a script delegate
    engine.Execute(@"
        Filter = lib.System.Func(lib.System.Int32, lib.System.Boolean);
        oddFilter = new Filter(function(value) {
            return (value & 1) ? true : false;
        });
    ");

    // use LINQ from script
    engine.Execute(@"
        oddNumbers = numbers.Where(oddFilter);
        Console.WriteLine(lib.System.String.Join(', ', oddNumbers));
    ");

    // call a script function
    engine.Execute("function print(x) { Console.WriteLine(x); }");
    engine.Script.print(DateTime.Now.DayOfWeek);

    // examine a script object
    engine.Execute("person = { name: 'Fred', age: 5 }");
    Console.WriteLine(engine.Script.person.name);
}

Jint를 볼 수 있습니다.http://jint.codeplex.com) Open-Source ECMAScript 통역사입니다.

업데이트

Github at에서 새로 다시 작성한 버전 https://github.com/sebastienros/jint

JavaScript .NET를 사용해야합니다.http://javaScriptDotnet.codeplex.com/) CodePlex에서. 그들은 관리 된 C ++로 V8을 마무리 한 다음 .NET 응용 프로그램과 함께이 라이브러리를 사용할 수 있으며 매력처럼 작동합니다. 오픈 소스는 당신이 나에게 물어 보면 아주 좋은 기능을 제공합니다.

건배.

jscript.net을 사용할 수 있으며 실제로 임의의 JavaScript 코드에서 작동합니다. 컴파일하여 "빠른 모드"를 끄면됩니다. jsc /fast- bar.js

나는 이것을 테스트하지 않았다. 나는 방금 읽는 동안 그것을 알아 차렸다 이 게시물 그리고 그것이 또 다른 합리적인 해결책이라고 생각했습니다. MSDN이 있습니다 이 옵션에 대한 문서 그리고 당신이 그것을 사용하지 않는 경우 제한 사항은 무엇입니까?.

v8.net

이것은 아마도 내가 아직 온 최고의 것일 것입니다.
https://v8dotnet.codeplex.com/documentation

또한 처음부터 모노 포트를 염두에두고 구축되었습니다. 관리 코드에서 V8 엔진의 전력을 완전히 제어 할 수 있습니다.

나는 다른 사람들보다 지인을 선호합니다.

Jint는 느릴 수 있지만 디버그하고 자신의 .NET 클래스를 상호 작용하기는 쉽습니다. (설정하기가 어렵습니다 [ComVisile] jscript.dll 등의 경우 매번 속성.

스레딩 측면에서 Jint와 Jurassic은 예상대로 작업합니다. JScript 엔진 또는 Google V8에서 작업하려면 UI 스레딩 문제에주의를 기울여야합니다.

그러나 Jint는 jQuery를 1.5 이상 컴파일하는 데 어려움이 있기 때문에 일부 측면에서는 구력이 있습니다.

Jurassic이 제한을 제거하여 자체 수업을 고수하여 만들어서 일할 수 있기를 바랍니다. 'AllowBob'sCLRClass=true'.

전체 수업을 다시 작성해야합니다. 그것은 어렵다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top