Мне записали настольное приложение в C#, который я хотел бы сделать scriptable на C#/VB. Идеально, пользователь открыл бы боковую панель и вещи записи как
foreach (var item in myApplication.Items)
item.DoSomething();
Наличие подсветки синтаксиса и завершения кода было бы потрясающим, но я мог жить без него. Я не хотел бы требовать, чтобы пользователи установили Visual Studio 2010.
Я думаю о вызове компилятора, загрузке и выполнении выходного блока.
Существует ли лучший путь?
Microsoft. До-диез ответ?
Я бы использовал PowerShell или MEF . Это действительно зависит от того, что вы имеете в виду под scritable, и от того, какое у вас приложение. Лучшее в PowerShell - это то, что он напрямую размещается и предназначен для использования интерфейсов .NET в виде сценариев.
Используйте язык сценариев. На ум приходит 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;
}
Вы все равно вызовете компилятор, потому что C # - это компилируемый язык. Лучший способ сделать это можно проверить в CSharpCodeProvider - класс .
На каком языке написано ваше приложение? Если на C++, то можно рассмотреть Google V8, встраиваемый движок ECMAScript/JavaScript.
В качестве примера можно использовать следующее решение с открытым исходным кодом: https://bitbucket.org/jlyonsmith/coderunner/wiki/Home