向现有C#项目添加脚本功能

时间:2016-11-11 16:56:51

标签: c# scripting

我在一个研究小组工作,我的任务是为数据采集程序添加脚本功能。理想情况下,我希望能够在数据采集软件运行时编写脚本(并在运行时将这些脚本保存为文件)。命令行也可能不错。

我对C#一点都不熟悉,但我确实在其他语言(Objective-C,Python)方面有相当多的编码经验。我看到了这个链接https://blogs.msdn.microsoft.com/cdndevs/2015/12/01/adding-c-scripting-to-your-development-arsenal-part-1/,其中详细介绍了“Roselyn脚本编写软件包”,但我不确定这是否是我最好的选择。

有人能建议获得完整脚本功能的最简单方法吗? (我试图避免在这里失去几个月的生命= p)。非常感谢开始/建议的链接。

谢谢!

2 个答案:

答案 0 :(得分:0)

你为我发布了一个有趣的链接,因为我几周前刚刚制作了类似的东西,但还没有实现。我的目标是创建一个C#"立即"控制台在网页上。

有一些关于以编程方式加载某些程序集的小问题,并且必须明确地引用它们。

这是后面的代码,请稍后发布您的解决方案,我很想知道。

这可以在运行时编写c#代码并获得String返回。

protected void getImmediateResult_Click(object sender, EventArgs e)
    {

        //building the code
        string source = @"using System; 
        class MyType{
        public static String Evaluate(){
        <!expression!>
        }}";

        string expression = this.txtimmediate.Text;
        string finalSource = source.Replace("<!expression!>", expression);
        textcodeCheck.Text = finalSource;
        var compileUnit = new CodeSnippetCompileUnit(finalSource);

        //preparing compilation
        CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();

        // Create the optional compiler parameters

        //this correctly references the application but no System.Web etc
        string[] refArray = new string[2];

        UriBuilder uri = new UriBuilder(Assembly.GetExecutingAssembly().CodeBase);
        refArray[0] = uri.Path;

        //this works
        refArray[1] = "System.Web" + ".dll";

        ////NOT WORKING for non microsoft assemblies
        //var allRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
        //string[] refArray = new string[allRefs.Length + 1];
        //int i = 1;
        //foreach (AssemblyName refer in allRefs)
        //{
        //    refArray[i] = refer.Name + ".dll";
        //    i++;
        //}

        var compilerParameters = new CompilerParameters(refArray);

        CompilerResults compilerResults = provider.CompileAssemblyFromDom(compilerParameters, compileUnit);
        if (compilerResults.Errors.Count > 0)
        {
            //1st error
            this.txtResult.Text = compilerResults.Errors[0].ErrorText;
            return;
        }

        //running it
        Type type = compilerResults.CompiledAssembly.GetType("MyType");
        MethodInfo method = type.GetMethod("Evaluate");
        String result = (String)method.Invoke(null, null);


        this.txtResult.Text = result;
    }

答案 1 :(得分:0)

如果您愿意使用IronPython,可以直接在C#中执行脚本:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;

private static void doPython()
{
    ScriptEngine engine = Python.CreateEngine();
    engine.ExecuteFile(@"test.py");
}

Get IronPython here.