Ссылка на движок Google V8 из приложения.NET
Я создаю приложение.NET 3.5, и мне нужно оценить код JS на сервере - в основном это пользовательский набор правил, который может работать в браузере или на сервере. Управляемый JS не вариант, потому что код JS будет предоставляться во время выполнения. Jaxer Aptana также не вариант. Поэтому я решил использовать сборку движка V8 в своем приложении.
Я успешно встроил источник в DLL, но эта DLL не является управляемой библиотекой и также не является COM. V8 просто C++.
Любые идеи относительно того, как взаимодействовать с этим типом DLL в C#? Кроме того, я открыт для других предложений для SpiderMonkey или другого движка JS.
Заранее спасибо.
ОБНОВИТЬ:
Я был в состоянии использовать решение Райана. Я только что обновил ссылки на сборку для последней из ствола. Это работало отлично. Спасибо Райан.
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 - это решение, в котором есть управляемый proj-модуль C++ и консольное приложение C# для тестирования.
Зависимости \V8 - это мой код V8, который я использовал для сборки библиотеки V8.
Надеюсь, поможет!
Вы можете попробовать Javascript.NET:
http://javascriptdotnet.codeplex.com/
Это позволяет вам создавать контекст V8 из.NET и регистрировать в нем объекты CLI, чтобы вы могли ими манипулировать и вызывать членов из кода Javascript. Он компилирует Javascript во время выполнения.
Проверьте это.
Проверьте v8sharp. Он поддерживает выполнение JS внутри приложения.NET. Это также позволяет вам регистрировать типы.NET с помощью механизма v8, чтобы ваш код JS мог взаимодействовать с вашим кодом.NET. Я нахожусь в процессе добавления поддержки для перехвата поддержки функции / делегата.
Вы также можете попробовать V8.NET.
Это позволяет вам легко интегрировать код с V8 на более низком уровне, чем многие другие оболочки.
Microsoft создает реальный Javascript, а не "JScript" - среду выполнения (вместе с IronPython, IronRuby и VB10) на CLR, используя DLR, но я не могу найти для него никаких загрузок или контента. Возможно это прибудет с C# 4?
Поскольку этот вопрос был опубликован некоторое время назад, я подумал, что дам немного обновления.
Microsoft создала механизм сценариев ClearScript, который поддерживает V8, JScript и VBScript.
Вы можете легко добавлять типы C#, такие как Console, и использовать их в своем скрипте. Добавление типа кнопки WPF и его создание тоже не проблема. В github есть несколько отличных примеров, поэтому я предлагаю всем, кто это читает, быстро взглянуть.
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!):')");
}
}
Из того, что я слышал, компиляция с помощью IJW (Managed C++) должна работать просто - но я могу ошибаться, я никогда не касался MC++.