Как я могу подать свою заявку, scriptable в C#?

Мне записали настольное приложение в C#, который я хотел бы сделать scriptable на C#/VB. Идеально, пользователь открыл бы боковую панель и вещи записи как

foreach (var item in myApplication.Items)
   item.DoSomething();

Наличие подсветки синтаксиса и завершения кода было бы потрясающим, но я мог жить без него. Я не хотел бы требовать, чтобы пользователи установили Visual Studio 2010.

Я думаю о вызове компилятора, загрузке и выполнении выходного блока.

Существует ли лучший путь?

Microsoft. До-диез ответ?

11
задан Peter Mortensen 6 September 2012 в 18:19
поделиться

6 ответов

Я бы использовал PowerShell или MEF . Это действительно зависит от того, что вы имеете в виду под scritable, и от того, какое у вас приложение. Лучшее в PowerShell - это то, что он напрямую размещается и предназначен для использования интерфейсов .NET в виде сценариев.

1
ответ дан 3 December 2019 в 10:25
поделиться

Вы думали о IronPython или IronRuby?

4
ответ дан 3 December 2019 в 10:25
поделиться

Используйте язык сценариев. На ум приходит Tcl , LUA или даже JavaScript.

Использовать Tcl действительно просто:

using System.Runtime.InteropServices;
using System;

namespace TclWrap {
    public class TclAPI {
         [DllImport("tcl84.DLL")]
         public static extern IntPtr Tcl_CreateInterp();
         [DllImport("tcl84.Dll")]
         public static extern int Tcl_Eval(IntPtr interp,string skript);
         [DllImport("tcl84.Dll")]
         public static extern IntPtr Tcl_GetObjResult(IntPtr interp);
         [DllImport("tcl84.Dll")]
         public static extern string Tcl_GetStringFromObj(IntPtr tclObj,IntPtr length);
    }
    public class TclInterpreter {
        private IntPtr interp;
        public TclInterpreter() {
            interp = TclAPI.Tcl_CreateInterp();
            if (interp == IntPtr.Zero) {
                throw new SystemException("can not initialize Tcl interpreter");
            }
        }
        public int evalScript(string script) {
            return TclAPI.Tcl_Eval(interp,script);        
        }
        public string Result {
            get { 
                IntPtr obj = TclAPI.Tcl_GetObjResult(interp);
                if (obj == IntPtr.Zero) {
                    return "";
                } else {
                    return TclAPI.Tcl_GetStringFromObj(obj,IntPtr.Zero);
                }
            }
        }
    }
}

Затем используйте его так:

TclInterpreter interp = new TclInterpreter();
string result;
if (interp.evalScript("set a 3; {exp $a + 2}")) {
    result = interp.Result;
}
1
ответ дан 3 December 2019 в 10:25
поделиться

Вы все равно вызовете компилятор, потому что C # - это компилируемый язык. Лучший способ сделать это можно проверить в CSharpCodeProvider - класс .

1
ответ дан 3 December 2019 в 10:25
поделиться

На каком языке написано ваше приложение? Если на C++, то можно рассмотреть Google V8, встраиваемый движок ECMAScript/JavaScript.

0
ответ дан 3 December 2019 в 10:25
поделиться

В качестве примера можно использовать следующее решение с открытым исходным кодом: https://bitbucket.org/jlyonsmith/coderunner/wiki/Home

1
ответ дан 3 December 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: