Ссылка на движок Google V8 из приложения .NET

Я создаю приложение .NET 3.5, и мне нужно оценить код JS на сервере - в основном это пользовательский набор правил, который может работать в браузере или на сервере. Управляемый JS не вариант, потому что код JS будет предоставляться во время выполнения. Jaxer Aptana также не вариант. Поэтому я решил использовать сборку движка V8 в своем приложении.

Я успешно встроил исходный код в DLL, но эта DLL не является управляемой библиотекой и также не является COM. V8 просто C ++.

Любые идеи относительно того, как взаимодействовать с этим типом DLL в C #? Кроме того, я открыт для других предложений для SpiderMonkey или другого движка JS.

Заранее спасибо.

ОБНОВИТЬ:

Я был в состоянии использовать решение Райана. Я только что обновил ссылки на сборку для последней из ствола. Это работало отлично. Спасибо Райан.

10.12.2008 17:47:07
Кроме того, где я могу получить копию скомпилированной DLL? (Поскольку мне лень его самому компилировать, в основном потому, что у меня нет VS, настроенного на C ++)
Jason Bunting 10.12.2008 19:10:08
Я обновил свой пост ссылкой на скачивание созданного мной тестового проекта.
Ryan Cook 10.12.2008 21:43:05
Для тех, кто только находит эту страницу, теперь в Codeplex есть и V8.NET.
James Wilkins 1.06.2013 19:32:09
v8dotnet.codeplex.com V8.NET в Codeplex
rahulroy9202 27.01.2014 07:40:56
V8.Net теперь на NuGet и поддерживает стандарт .Net! :) ( nuget.org/packages/V8.Net )
James Wilkins 10.03.2019 09:42:11
8 ОТВЕТОВ
РЕШЕНИЕ

Я понимаю, что это не может быть точным ответом на ваш вопрос, но я решил, что вложу свои 2 цента, поскольку сомневаюсь, что многие люди пытались это сделать.

Я заставил его работать, создав управляемую оболочку в смешанном режиме C ++. Есть и другие способы сделать это, но я собирался сделать полную обертку, которую можно использовать с любым языком .NET.

Заставить библиотеку компилировать таким образом, чтобы она могла быть включена в проект в смешанном режиме, было немного сложной задачей. Мне пришлось изменить библиотеку времени выполнения (в файле SConstruct), используемую для / MD и / MDd, чтобы она была совместима с ключом / clr.

Пока у меня работают только простые скрипты, так как я не реализовал обратные вызовы, пользовательские методы, объекты и тому подобное.

Вот краткий пример того, как выглядит использование одного из моих тестовых приложений:

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

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

Он также запускает более сложные скрипты, такие как кодировщик base64. Но сейчас я могу добавлять только пользовательские элементы со стороны C ++.

Я готов предоставить дополнительную информацию + код, если кому-то интересно, так как я не могу забрать этот проект обратно. Но, я боюсь, что это много кода, чтобы войти в пост здесь, поэтому мы должны были бы найти какой-то другой носитель, как Google Code или CodePlex.

Редактировать:


ОК, я загрузил код. Я должен поставить на это заявление об отказе: проект очень ранний, и я в лучшем случае любитель C ++, так что не надейтесь слишком сильно. Кроме того, этот проект был создан / выполнен сразу после выпуска Chrome, поэтому включенная версия v8 может быть устаревшей.

Тем не менее, вот оно: http://ryanscook.com/Files/V8-DotNet.zip (21,5 МБ)

В пакете вы найдете следующие предметы, представляющие интерес:

V8Net-Library \ V8.Net \ V8.Net.sln - это решение, в котором есть управляемая оболочка C ++ proj и консольное приложение C # для тестирования.

Зависимости \ V8 - это мой код V8, который я использовал для сборки библиотеки V8.

Надеюсь, поможет!

33
7.12.2018 08:14:14
«Мне пришлось изменить библиотеку времени выполнения (в файле SConstruct), используемую для / MD и / MDd, чтобы она была совместима с ключом / clr». - не очень сложная задача! :)
leppie 10.12.2008 19:37:06
Хорошо найти наш, что должно было быть сделано. Печатание всегда легкая часть. Я предполагаю, что мое отсутствие опыта с C ++ немного добавило разочарования.
Ryan Cook 10.12.2008 19:46:14
Райан: Спасибо за помощь. Я хотел бы сделать сборку с ключом / clr - как то, что вы сделали. У меня нет никакого опыта с Scons. Пожалуйста, дайте мне знать более подробно изменения, которые вы внесли в файл SConstruct. В частности, где вы указываете /clrпереключатель. Кроме того, похоже на общую библиотеку, /MDуже используется. Заранее спасибо за помощь.
NathanD 10.12.2008 20:02:51
Если честно, я не могу вспомнить точные детали моей сборки v8. / Clr находится в библиотеке оболочки. В основном мне пришлось создать слегка измененный v8.lib, чтобы я мог связать его с моим dll в смешанном режиме. Сегодня я постараюсь найти время, чтобы опубликовать проекты, которые вы можете загрузить.
Ryan Cook 10.12.2008 20:09:31
Райан: Смотрите мое обновление выше. Ваш код отлично работает со сборкой из последней из ствола. Спасибо.
NathanD 12.12.2008 03:55:43

Из того, что я слышал, компиляция с помощью IJW (Managed C ++) должна работать просто - но я могу ошибаться, я никогда не касался MC ++.

0
10.12.2008 19:48:16

Microsoft создает реальный javascript, а не "JScript" - среду выполнения (вместе с IronPython, IronRuby и VB10) для CLR, используя DLR, но я не могу найти для него никаких загрузок или контента. Возможно это прибудет с C # 4?

1
10.12.2008 20:13:14
Да, я слышал о реализации JS DLR некоторое время назад, поэтому я сначала изучил это. Но, к сожалению, MSFT, похоже, еще не выпустила ничего для JS, только IronPython. Облом.
NathanD 10.12.2008 21:07:41
Управляемый JavaScript на DLR мертв. Смотрите этот ответ: code.google.com/apis/v8/design.html
James Hugard 23.06.2009 23:00:25
Я не понимаю, как документы по дизайну V8 имеют какое-либо отношение к Javascript на DLR? Суть javascript в DLR заключается не только в чистой скорости (хотя это было бы неплохим бонусом), но и в чистом взаимодействии с существующей экосистемой .NET, чего не делает V8
Orion Edwards 24.06.2009 20:37:18

Проверьте v8sharp . Он поддерживает выполнение JS внутри приложения .NET. Он также позволяет вам регистрировать типы .NET с помощью механизма v8, чтобы ваш код JS мог взаимодействовать с вашим кодом .NET. Я нахожусь в процессе добавления поддержки для перехвата поддержки функции / делегата.

13
30.06.2010 02:54:44
v8sharp отлично, я использовал в своем проекте.
guaike 27.08.2010 10:27:17

Вы можете попробовать Javascript .NET:

http://javascriptdotnet.codeplex.com/

Это позволяет вам создавать контекст V8 из .NET и регистрировать в нем объекты CLI, чтобы вы могли ими манипулировать и вызывать членов из кода Javascript. Он компилирует Javascript во время выполнения.

Проверьте это.

18
5.07.2010 22:34:49
правда, довольно круто, однако очень не подходит для использования на стороне сервера .. потому что движок V8 не безопасен для потоков. (см .: javascriptdotnet.codeplex.com/workitem/7062 ) Это был облом ...
Davy Landman 27.04.2011 13:39:38
javascriptdotnet теперь потокобезопасен. Несколько экземпляров (изолятов) v8 могут работать одновременно, но они не могут взаимодействовать.
Oliver Bock 19.03.2012 23:57:46

Я думаю, гатапия заменила js.net на jish

0
23.05.2017 11:51:02

Вы также можете попробовать V8.NET.

https://www.nuget.org/packages/V8.Net/

Это позволяет вам легко интегрировать код с V8 на более низком уровне, чем многие другие оболочки. Он также поддерживает .Net 4.6.1+ и .Net Standard 2.0+ (.Net Core).

1
10.03.2019 09:43:21

Necromancing.
Согласно 2018 и .NET Core 2.0+
вы можете использовать vroomjs-core

Выполнить некоторые 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 ...?"));
    }
}

Получите доступ к свойствам и вызовите методы для объектов CLR из Javascript:

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!):')");
    }
}
0
22.07.2018 19:31:33