我喜欢关于如何实现我正在开展的项目的关键部分的一些想法。本质上它是数据映射,我复制字段x并将其放入字段y。但是,需要有一些能够在转换期间动态更改(使用字符串操作)该值。
我想要的是一个文本框,用户可以输入脚本,允许他们使用脚本语言修改该值,最好是VBScript。然后,这将允许他们做这样的简单操作,这将采用子字符串:
Mid({input_value}, 2, 4)
其中
{input_value}
将在运行时替换为实际值。
因此,例如,如果来自“field x”的输入是“This is a test”并且他们使用上面的start = 2和length = 4的示例,则保存到“field y”的值将是“他的“
我知道如何从C#运行VBScript作为一个scipt,这不是问题。但是,是否可以在运行时运行和评估上面的srcipts并将输出记录回C#变量?
否则,是否有人对我如何处理此问题有任何建议?
非常感谢
答案 0 :(得分:1)
您可能希望查看基于DLR的语言,例如IronPython或IronRuby。两者都允许嵌入,Michael Foord对如何将这些嵌入到应用程序中有tutorial。
如果您使用标准DLR接口,我相信您可以嵌入任何语言,包括DLRBasic和ASP Classic Compiler。 Ben Hall在Red Gate的生产应用程序中有一篇关于IronRuby embedding的文章。
我认为您需要查看下面显示的SetVariable()和GetVariable()方法,以获取从脚本设置和返回数据的示例:
public string evaluate(string x, string code)
{
scope.SetVariable("x", x);
scope.SetVariable("button", this.button);
try
{
ScriptSource source = engine.CreateScriptSourceFromString(code,
SourceCodeKind.Statements);
source.Execute(scope);
}
catch (Exception ex)
{
return "Error executing code: " + ex.ToString();
}
if (!scope.VariableExists("x"))
{
return "x was deleted";
}
string result = scope.GetVariable<object>("x").ToString();
return result;
}
此示例取自http://www.voidspace.org.uk/ironpython/dlr_hosting.shtml。
答案 1 :(得分:0)
这是一个使用运行时表达式编译的工作示例。我借用了这个概念和大部分代码from here。
static void Main(string[] args)
{
string input = "This is a test";
string method = "Mid(x, 2, 4)"; // 'x' represents the input value
string output = Convert(method, input);
Console.WriteLine("Result: " + output);
Console.ReadLine();
}
// Convert input using given vbscript logic and return as output string
static string Convert(string vbscript, string input)
{
var func = GetFunction(vbscript);
return func(input);
}
// Create a function from a string of vbscript that can be applied
static Func<string, string> GetFunction(string vbscript)
{
// generate simple code snippet to evaluate expression
VBCodeProvider prov = new VBCodeProvider();
CompilerResults results = prov.CompileAssemblyFromSource(
new CompilerParameters(new[] { "System.Core.dll" }),
@"
Imports System
Imports System.Linq.Expressions
Imports Microsoft.VisualBasic
Class MyConverter
Public Shared Function Convert() As Expression(Of Func(Of String, String))
return Function(x) " + vbscript + @"
End Function
End Class
"
);
// make sure no errors occurred in the conversion process
if (results.Errors.Count == 0)
{
// retrieve the newly prepared function by executing the code
var expr = (Expression<Func<string, string>>)
results.CompiledAssembly.GetType("MyConverter")
.GetMethod("Convert").Invoke(null, null);
Func<string, string> func = expr.Compile();
// create a compiled function ready to apply and return
return func;
}
else
{
return null;
}
}