.NET 앱에서 Google V8 엔진을 참조하십시오
-
21-08-2019 - |
문제
.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 ++를 만지지 않았습니다.
네크로 킹.
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)도 지원합니다.