c#和动态字符串脚本

时间:2011-05-17 01:56:37

标签: c# scripting dynamic

我喜欢关于如何实现我正在开展的项目的关键部分的一些想法。本质上它是数据映射,我复制字段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#变量?

否则,是否有人对我如何处理此问题有任何建议?

非常感谢

2 个答案:

答案 0 :(得分:1)

您可能希望查看基于DLR的语言,例如IronPython或IronRuby。两者都允许嵌入,Michael Foord对如何将这些嵌入到应用程序中有tutorial

如果您使用标准DLR接口,我相信您可以嵌入任何语言,包括DLRBasicASP 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;
    }
}