将C#用作C#应用程序的脚本语言

6
我开发了一个应用程序,使用C#脚本文件来进行某些配置和设置。脚本文件包含各种用户生成的对象以及对这些对象的特定函数。目前,用户必须使用第三方编辑器生成一个.cs文件,并提供路径供我的程序使用。这种方法的缺点是,用户在编辑脚本文件时没有自动完成和 IntelliSense 支持的灵活性。
我想将脚本编辑部分嵌入我的应用程序中。我可以使用富文本编辑器来实现这一点。但编写自动完成部分非常麻烦。有没有办法为用户提供一个程序内编辑器,同时也具备自动完成功能......
编写一个在程序中动态编译脚本的代码。
public String Compile(String inputfilepath)
    {

        CompilerResults res = null;
        CSharpCodeProvider provider = new CSharpCodeProvider();
        String errors = "";

        if (provider != null)
        {
            try
            {
                Assembly asb = Assembly.Load("BHEL.PUMPSDAS.Datatypes, Version=1.0.0.0, Culture=neutral, PublicKeyToken=81d3de1e03a5907d"); 
                CompilerParameters options = new CompilerParameters();
                options.GenerateExecutable = false;
                options.OutputAssembly = String.Format(outFileDir + oName);
                options.GenerateInMemory = false;
                options.TreatWarningsAsErrors = false;
                options.ReferencedAssemblies.Add("System.dll");
                options.ReferencedAssemblies.Add("System.Core.dll");
                options.ReferencedAssemblies.Add("System.Xml.dll");
                options.ReferencedAssemblies.Add("System.Xml.dll");
                options.ReferencedAssemblies.Add(asb.Location);
                res = provider.CompileAssemblyFromFile(options, inputfilepath);
                errors = "";
                if (res.Errors.HasErrors)
                {
                    for (int i = 0; i < res.Errors.Count; i++)
                    {
                        errors += "\n " + i + ". " + res.Errors[i].ErrorText;
                    }
                }
            }

            catch (Exception e)
            {
                throw (new Exception("Compilation Failed with Exception!\n" + e.Message +
                    "\n Compilation errors : \n" + errors + "\n"));
            }

        }
        return errors;
    }

1
C#本身就是我的脚本语言。我正在使用CodeDom命名空间来从程序内部实时编译C#脚本文件。 - Raghavendra Kumar
1
是的!!它也很容易使用... - Raghavendra Kumar
5
@David,请熟悉一下Roslyn。特别是:「以及即将推出支持使用VB和C#进行脚本和交互式使用的功能。」 - Kirk Woll
@KirkWoll,您应该将该评论转换为答案。那就是我要提供的答案。“使用Roslyn”。 - Josh Smeaton
@RaghavendraKumar 我不熟悉Roslyn,恐怕无法提供很多帮助。但是它是一种编译器服务。为了执行自动完成和语法高亮等操作,需要分析代码。Roslyn提供了进行适当的C#分析所需的工具。否则,您将需要从头开始构建一个小型编译器。如果可以避免,这绝不是您想要做的事情。 - Josh Smeaton
显示剩余6条评论
1个回答

2
具体来说,对于自动完成,您需要使用两个系统:解析器和反射。
解析器在理论上是一个非常简单的概念,但我相信对于像C#这样具有许多语法糖和许多上下文敏感关键字的语言来说,编写它并不容易。
由于.NET本质上是反射性的,并提供了反射框架,因此那部分也不应该非常痛苦。反射允许您操作组成已编译程序集的面向对象元素 - 以及程序集本身 - 作为对象。例如,方法将是一个Method对象。您可以通过检查Type类的成员来窥视此系统,这为反射提供了一个基本起点。另一个有用的起点是Assembly。像往常一样,MSDN以结构化格式提供了丰富的“官方”信息。

你的方法适用于已经编译好的系统。我想要的是类似Visual Studio的Intellisense,它可以在代码编译之前就能够工作。 - Raghavendra Kumar
这基本意味着您在按部就班地编译代码。同样的想法。您仍然可以使用反射;框架已经就位。您基本上正在编译面向对象的外壳。您需要为局部变量执行一些自定义操作,但那只是一个元素。 - Zenexer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接