Question

Je construis une application .NET 3.5 et ont la nécessité d'évaluer le code JS sur le serveur - essentiellement un ensemble de règles fournies par l'utilisateur qui peut fonctionner dans un navigateur ou sur le serveur. Managed JS est pas une option, car le code JS sera fourni lors de l'exécution. Jaxer de Aptana est pas une option. Alors que je cherchais en utilisant une version du moteur V8 dans mon application.

J'ai construit avec succès la source dans une DLL, mais que DLL n'est pas pas une bibliothèque gérée et ne COM soit. V8 est tout simplement C ++.

Toutes les idées sur la façon de interop avec ce type de DLL en C #? De plus, je suis ouvert à d'autres suggestions pour SpiderMonkey ou un autre moteur JS.

Merci d'avance.

Mise à jour:

Je suis en mesure d'utiliser la solution de Ryan. Je viens de mis à jour les références à la construction pour les dernières nouvelles de tronc. Il fonctionnait très bien. Merci Ryan.

Était-ce utile?

La solution

Je me rends compte que cela peut ne pas être une réponse exacte à votre question, mais je pensais que je mettrais mes 2 cents en valeur que je doute beaucoup de gens ont essayé.

Je l'ai créé à travailler par un wrapper managé en utilisant le mode mixte C ++. Il existe d'autres façons de le faire, mais je vais essayer de faire un emballage complet qui pourrait être utilisé à partir de tout langage .NET.

Comment se lib compiler de telle sorte qu'il puisse être inclus dans un projet en mode mixte a été un peu un défi. Je devais modifier la bibliothèque d'exécution (dans le fichier SConstruct) utilisé pour / MD et / MDd afin qu'il soit compatible avec le commutateur / clr.

Jusqu'à présent, je ne dispose que de simples scripts en cours d'exécution que je ne l'ai pas mis en œuvre, les méthodes callbacks personnalisés, des objets et autres.

Voici un exemple rapide de ce que l'utilisation ressemble à une de mes applications de test:

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

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

Il exécute des scripts plus complexes comme un encodeur base64 bien aussi. Mais pour l'instant je ne peux ajouter des éléments personnalisés du c ++ côté.

Je suis prêt à fournir plus d'informations + code si quelqu'un est intéressé que je ne jamais prendre ce projet de sauvegarde. Mais, je crains que ce moyen de beaucoup de code à entrer dans un poste ici, donc il nous faudrait trouver un autre moyen comme le code Google ou CodePlex.

Modifier


OK, je l'ai téléchargé le code. Je dois mettre un avertissement à ce sujet: Le projet est très tôt et je suis un amateur de C ++ au mieux donc ne soyez pas vos espoirs trop. En outre, ce projet a été créé / fait juste après le chrome a été libéré de sorte que la version de v8 inclus peut-être vieux.

Cela dit, voici: http://ryanscook.com/Files/V8- DotNet.zip (21,5 Mo)

Dans le paquet, vous trouverez les éléments suivants d'intérêt:

  

V8Net-Library \ V8.Net \ V8.Net.sln - Cette   est la solution qui a la gestion   C ++ wrapper proj et une application console C #   pour les tests.

     

dépendances \ V8 - Ceci est mon code V8   que je construisais la lib V8.

it helps!

Autres conseils

Vous pouvez essayer Javascript .NET:

http://javascriptdotnet.codeplex.com/

Il vous permet de créer un contexte V8 de .NET et enregistrer des objets CLI afin que vous puissiez les manipuler et les membres appeler du code Javascript. Il compile le Javascript lors de l'exécution.

Check it out.

Consultez v8sharp . Il prend en charge l'exécution JS à l'intérieur d'une application .NET. Il vous permet également d'enregistrer les types .NET avec le moteur v8 afin que votre code JS peut interagir avec votre code .NET. Je suis en train d'ajouter le support pour l'accrochage fonction / support de délégué.

sont la construction un vrai javascript - pas « JScript » - exécution (avec IronPython, IronRuby et VB10) sur le CLR à l'aide du DLR, mais je ne peux pas trouver aucun téléchargement ou contenu pour elle. Peut-être que cela arrivera avec C # 4?

D'après ce que j'entends compilez avec IJW (Managed C ++) devrait fonctionner -. Mais je peux être vraiment mal, j'ai jamais toucher MC ++

Je suppose que gatapia a remplacé js.net avec Jish

Necromancing.
Selon 2018 et .NET de base 2.0+
vous pouvez utiliser vroomjs-core

Exécuter du 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
    }
}

Créer et retourner un objet Javascript, puis appeler une méthode sur elle:

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 ...?"));
    }
}

Propriétés de l'accès et des méthodes d'appel sur les objets CLR de 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!):')");
    }
}

Vous pouvez V8.NET ainsi.

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

Il vous permet d'intégrer facilement le code avec V8 à un niveau plus bas que beaucoup d'autres emballages. Il prend également en charge .Net 4.6.1+ et .Net standard 2.0+ (.Net de base).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top