문제

.NET 3.5 응용 프로그램을 구축하고 서버에서 JS 코드를 평가해야합니다. 기본적으로 브라우저 또는 서버에서 작동 할 수있는 사용자 제공 규칙 세트입니다. JS 코드는 런타임에 제공되므로 관리되는 JS는 옵션이 아닙니다. Aptana의 Jaxer도 옵션이 아닙니다. 그래서 앱 내에서 V8 엔진의 빌드를 사용하고있었습니다.

소스를 DLL에 성공적으로 구축했지만 DLL은 관리되는 라이브러리가 아니며 COM도 아닙니다. V8은 단지 일반 C ++입니다.

C#에서이 유형의 DLL과 상호 작용하는 방법에 대한 아이디어가 있습니까? 또한 Spidermonkey 또는 다른 JS 엔진에 대한 다른 제안에 열려 있습니다.

미리 감사드립니다.

업데이트:

Ryan의 솔루션을 사용할 수있었습니다. 방금 Trunk의 최신 빌드에 대한 참조를 업데이트했습니다. 잘 작동했습니다. 감사합니다 Ryan.

도움이 되었습니까?

해결책

나는 이것이 당신의 질문에 대한 정확한 답이 아닐 수도 있다는 것을 알고 있지만, 나는 많은 사람들이 이것을 시도했다고 의심 할 때 2 센트의 가치를 넣을 것이라고 생각했습니다.

혼합 모드 C ++를 사용하여 관리되는 래퍼를 만들어 작업하게되었습니다. 다른 방법이 있지만 .NET 언어에서 사용할 수있는 전체 포장지를 만들려고했습니다.

혼합 모드 프로젝트에 포함될 수있는 방식으로 LIB를 컴파일하는 것은 약간 어려운 일이었습니다. /md 및 /mdd에 사용 된 런타임 라이브러리 (Sconstruct 파일)를 /CLR 스위치와 호환되도록 수정해야했습니다.

지금까지 콜백, 사용자 정의 메소드, 객체 등을 구현하지 않았기 때문에 간단한 스크립트 만 실행 중입니다.

다음은 테스트 앱 중 하나에 대한 사용법의 빠른 샘플입니다.

V8DotNet.Shell shell = new V8DotNet.Shell();

shell.ExecuteScript(@"print('V8 version is: ' + version());");

Base64 인코더 미세와 같이 더 복잡한 스크립트를 실행합니다. 그러나 지금은 C ++ 측에서 사용자 정의 항목 만 추가 할 수 있습니다.

이 프로젝트를 다시 선택하지 않을 수도 있으므로 누군가가 관심이있는 경우 더 많은 정보 + 코드를 기꺼이 제공 할 의향이 있습니다. 그러나 여기에 게시물로 들어가는 많은 코드가 두려워서 Google 코드 또는 CodePlex와 같은 다른 매체를 찾아야합니다.

편집하다:


좋아, 코드를 업로드했습니다. 나는 이것에 대해 면책 조항을 넣어야한다. 이 프로젝트는 매우 이르고 C ++의 아마추어이므로 희망을 너무 많이 얻지 마십시오. 또한이 프로젝트는 Chrome이 출시 된 직후에 만들어 지거나 완료되었으므로 포함 된 V8 버전이 오래 될 수 있습니다.

즉, 여기에 있습니다. http://ryanscook.com/files/v8-dotnet.zip (21.5MB)

패키지에는 다음과 같은 관심 항목이 있습니다.

v8net -library v8.net v8.net.sln- 이것은 관리 된 C ++ 래퍼 PROJ와 테스트 용 C# 콘솔 앱을 갖춘 솔루션입니다.

종속성 v8- 이것은 V8 LIB를 구축하는 데 사용한 V8 코드입니다.

도움이되기를 바랍니다!

다른 팁

JavaScript .NET을 시도 할 수 있습니다.

http://javaScriptDotnet.codeplex.com/

.NET에서 V8 컨텍스트를 만들고 CLI 객체를 등록하여 조작하고 JavaScript 코드에서 멤버를 호출 할 수 있습니다. 런타임에 JavaScript를 컴파일합니다.

확인 해봐.

체크 아웃 v8sharp. .NET 응용 프로그램 내부에서 JS를 실행하는 것을 지원합니다. 또한 JS 코드가 .NET 코드와 상호 작용할 수 있도록 V8 엔진에 .NET 유형을 등록 할 수 있습니다. 나는 후크 기능/대의원 지원에 대한 지원을 추가하는 중입니다.

마이크로 소프트 "jscript"가 아닌 실제 JavaScript를 구축하고 있습니다 - 런타임 DLR을 사용하여 CLR에서 (Ironpython, Ironruby 및 VB10과 함께) 다운로드 나 콘텐츠를 찾을 수는 없습니다. 아마도 이것은 C# 4와 함께 도착합니까?

IJW (Managed C ++)로 컴파일하는 것을 듣는 것은 단지 작동해야하지만 실제로 잘못되었을 수도 있습니다. MC ++를 만지지 않았습니다.

가타피아가 교체 한 것 같아요 js.net ~와 함께 Jish

네크로 킹.
2018 및 .NET Core 2.0+에 따라
당신이 사용할 수있는 vroomjs- 코어

일부 JavaScript 실행 :

using (var engine = new JsEngine())
{
    using (var context = engine.CreateContext())
    {
        var x = (double)context.Execute("3.14159+2.71828");
        Console.WriteLine(x);  // prints 5.85987
    }
}

JavaScript 객체를 작성하고 반환 한 다음 메소드를 호출하십시오.

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        // Create a global variable on the JS side.
        context.Execute("var x = {'answer':42, 'tellme':function (x) { return x+' '+this.answer; }}");
        // Get it and use "dynamic" to tell the compiler to use runtime binding.
        dynamic x = context.GetVariable("x");
        // Call the method and print the result. This will print:
        // "What is the answer to ...? 42"
        Console.WriteLine(x.tellme("What is the answer to ...?"));
    }
}

JavaScript의 CLR 객체에 대한 액세스 속성 및 호출 방법 :

class Test
{
    public int Value { get; set; }
    public void PrintValue(string msg)
    {
        Console.WriteLine(msg+" "+Value);
    }
}

using (JsEngine js = new JsEngine(4, 32))
{
    using (JsContext context = js.CreateContext())
    {
        context.SetVariable("m", new Test());
        // Sets the property from Javascript.
        context.Execute("m.Value = 42");
        // Call a method on the CLR object from Javascript. This prints:
        // "And the answer is (again!): 42"
        context.Execute("m.PrintValue('And the answer is (again!):')");
    }
}

v8.net도 시도 할 수 있습니다.

https://www.nuget.org/packages/v8.net/

이를 통해 Code를 다른 많은 래퍼보다 낮은 수준에서 V8과 쉽게 통합 할 수 있습니다. 또한 .NET 4.6.1+ 및 .NET Standard 2.0+ (.NET Core)도 지원합니다.

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