سؤال

أقوم بإنشاء تطبيق .NET 3.5 وأحتاج إلى تقييم كود JS على الخادم - وهو في الأساس مجموعة قواعد مقدمة من المستخدم يمكنها العمل داخل المتصفح أو على الخادم.لا يعد Managed JS خيارًا، لأنه سيتم توفير كود JS في وقت التشغيل.Aptana's Jaxer ليس خيارًا أيضًا.لذلك كنت أفكر في استخدام نسخة من محرك V8 داخل تطبيقي.

لقد قمت ببناء المصدر بنجاح في ملف DLL، ولكن ملف DLL هذا ليس مكتبة مُدارة وليس COM أيضًا.V8 هو مجرد C++ عادي.

هل هناك أي أفكار حول كيفية التفاعل مع هذا النوع من DLL في C#؟كما أنني منفتح على اقتراحات أخرى بخصوص SpiderMonkey أو أي محرك JS آخر.

شكرا لك مقدما.

تحديث:

لقد تمكنت من استخدام حل رايان.لقد قمت للتو بتحديث المراجع إلى الإصدار الأحدث من صندوق البريد.لقد عملت بشكل رائع.شكرا ريان.

هل كانت مفيدة؟

المحلول

أدرك أن هذا قد لا يكون إجابة دقيقة لسؤالك، لكنني اعتقدت أنني سأضع ما يساوي 2 سنتًا لأنني أشك في أن العديد من الأشخاص قد جربوا ذلك.

لقد نجحت في ذلك من خلال إنشاء غلاف مُدار باستخدام الوضع المختلط C++.هناك طرق أخرى للقيام بذلك، لكنني كنت سأحاول إنشاء غلاف كامل يمكن استخدامه من أي لغة .NET.

كان الحصول على تجميع lib بطريقة يمكن تضمينها في مشروع الوضع المختلط يمثل تحديًا كبيرًا.اضطررت إلى تعديل مكتبة وقت التشغيل (في ملف SConstruct) المستخدمة لـ /MD و/MDd بحيث تكون متوافقة مع المفتاح /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.5 ميجابايت)

ستجد في الحزمة العناصر التالية المثيرة للاهتمام:

V8Net-Library\V8.Net\V8.Net.sln - هذا هو الحل الذي يدار برنامج غلاف C ++ وتطبيق وحدة تحكم C # للاختبار.

التبعيات\V8 - هذا هو رمز V8 الخاص بي التي استخدمتها لبناء V8 lib.

نأمل أن يساعد!

نصائح أخرى

يمكنك تجربة Javascript .NET:

http://javascriptdotnet.codeplex.com/

يتيح لك إنشاء سياق V8 من .NET وتسجيل كائنات CLI فيه حتى تتمكن من معالجتها واستدعاء الأعضاء من كود Javascript.يقوم بتجميع جافا سكريبت في وقت التشغيل.

تحقق من ذلك.

الدفع v8sharp.وهو يدعم تنفيذ JS داخل تطبيق .NET.كما يسمح لك بتسجيل أنواع .NET مع محرك v8 حتى يتمكن كود JS الخاص بك من التفاعل مع كود .NET الخاص بك.أنا بصدد إضافة دعم لوظيفة التثبيت/دعم المفوض.

مايكروسوفت نقوم ببناء جافا سكريبت حقيقي - وليس "JScript" - وقت التشغيل (جنبًا إلى جنب مع IronPython وIronRuby وVB10) على CLR باستخدام DLR، لكن لا يمكنني العثور على أي تنزيلات أو محتوى له.ربما سيصل هذا مع C# 4؟

مما سمعته أن تجميعه باستخدام IJW (C++ المُدار) يجب أن يعمل فقط - ولكن قد أكون مخطئًا حقًا، لم أتطرق مطلقًا إلى MC++.

أعتقد أن جاتابيا قد تم استبداله js.net مع جيش

استحضار الأرواح.
وفقًا لعام 2018 و.NET Core 2.0+
يمكنك استخدام vroomjs-core

تنفيذ بعض جافا سكريبت:

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!):')");
    }
}

يمكنك تجربة V8.NET أيضًا.

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

فهو يتيح لك دمج التعليمات البرمجية بسهولة مع V8 بمستوى أقل من العديد من الأغلفة الأخرى.كما أنه يدعم .Net 4.6.1+ و.Net Standard 2.0+ (.Net Core).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top