Ссылка на движок Google V8 из приложения .NET.
Я создаю приложение .NET 3.5 и имею необходимость оценивать JS-код на сервере - в основном пользовательский набор правил, который может работать в браузере или на сервере. Управляемый JS не является вариантом, поскольку код JS будет предоставлен во время выполнения. Аптана Джаксер тоже не вариант. Поэтому я изучал использование сборки V8 в своем приложении.
Я успешно сгенерировал источник в DLL, но эта DLL не является управляемой библиотекой и не является COM. V8 - это просто С++.
Любые идеи относительно взаимодействия с этим типом DLL в С#? Кроме того, я открыт для других предложений для SpiderMonkey или другого JS-движка.
Спасибо заранее.
UPDATE:
Я смог использовать решение Райана. Я только что обновил ссылки на сборку для последних из туловища. Он отлично работал. Спасибо Райан.
Ответы
Ответ 1
Я понимаю, что это не может быть точным ответом на ваш вопрос, но я подумал, что поставил бы свои 2 цента на себя, поскольку я сомневаюсь, что многие люди это пробовали.
Я получил его для работы, создав управляемую оболочку с использованием смешанного режима C++. Есть и другие способы сделать это, но я собирался сделать полную оболочку, которая может быть использована с любого языка.NET.
Получение lib для компиляции таким образом, чтобы его можно было включить в проект с смешанным режимом, было немного сложной задачей. Мне пришлось изменить библиотеку времени выполнения (в файле SConstruct), используемую для /MD и /MDd, чтобы она была совместима с/clr-переключателем.
Пока у меня есть только простые скрипты, поскольку я не реализовал обратные вызовы, настраиваемые методы, объекты и т.д.
Вот краткий пример того, как выглядит приложение для одного из моих тестовых приложений:
V8DotNet.Shell shell = new V8DotNet.Shell();
shell.ExecuteScript(@"print('V8 version is: ' + version());");
Он также выполняет более сложные скрипты, такие как base64 encoder. Но теперь я могу добавлять только пользовательские элементы со стороны C++.
Я готов предоставить дополнительную информацию + код, если кому-то интересно, поскольку я, возможно, никогда не заберу этот проект. Но, я боюсь, что это очень кодовый код, чтобы войти в сообщение здесь, поэтому нам нужно будет найти другой носитель, например, код google или codePlex.
Редактировать:
Хорошо, я загрузил код. Мне нужно наложить на это отказ: проект очень ранний, и я в лучшем случае любитель в C++, поэтому не слишком сильно рассчитывайте на свои надежды. Кроме того, этот проект был создан/выполнен сразу после того, как был выпущен хром, поэтому версия v8, включенная, может быть старой.
Тем не менее, вот это: http://ryanscook.com/Files/V8-DotNet.zip (21.5 MB)
В пакете вы найдете следующие пункты, представляющие интерес:
V8Net-Library\V8.Net\V8.Net.sln - Это решение, которое имеет управляемый прокси-сервер C++ и консольное приложение С# для тестирования.
Зависимости\V8 - это мой код V8, который я использовал для сборки V8 lib.
Надеюсь, поможет!
Ответ 2
Вы можете попробовать Javascript.NET:
http://javascriptdotnet.codeplex.com/
Он позволяет создавать контекст V8 из .NET и регистрировать объекты CLI в нем, чтобы вы могли манипулировать ими и вызывать членов из кода Javascript. Он компилирует Javascript во время выполнения.
Проверьте это.
Ответ 3
Отъезд v8sharp. Он поддерживает выполнение JS внутри приложения .NET. Он также позволяет вам регистрировать типы .NET с движком v8, чтобы ваш JS-код мог взаимодействовать с вашим кодом .NET. Я в процессе добавления поддержки для подключения функции/делегата поддержки.
Ответ 4
Microsoft строит реальный javascript - не "JScript" - время выполнения (наряду с IronPython, IronRuby и VB10) в среде CLR, используя DLR, но я не могу найти никаких загрузок или контента для него. Возможно, это придет с С# 4?
Ответ 5
Из того, что я слышу, компиляция с помощью IJW (Managed С++) должна просто работать - но я могу быть действительно ошибаюсь, я никогда не касаюсь MС++.
Ответ 6
Я думаю, что gatapia заменила js.net с jish
Ответ 7
Вы также можете попробовать V8.NET.
http://v8dotnet.codeplex.com/
Это позволяет вам легко интегрировать код с V8 на более низком уровне, чем многие другие обертки.
Ответ 8
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!):')");
}
}