2013-04-20 84 views
7

我開發了一個應用程序,該應用程序使用c#腳本文件進行某些配置和設置。腳本文件包含各種用戶生成的對象以及這些對象的某些功能。目前,用戶必須使用第三方編輯器生成.cs文件,並提供路徑給我的程序以使用它。此方法的缺點是用戶在編輯腳本文件時不具備自動完成和智能感知支持的靈活性。使用C#作爲C#應用程序的腳本語言

我想將腳本編輯部分嵌入到我的應用程序中。我可以使用富文本編輯器來做到這一點。但是編寫auto-complete部分是一個巨大的痛苦。有什麼辦法可以向用戶提供程序內編輯器,該程序編輯器也可以自動完成...

用於在程序中動態編譯腳本的代碼。

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; 
    } 
+0

Lua,Python或powerscript?你使用哪種腳本語言? – David 2013-04-20 03:43:04

+1

C#本身就是我的腳本語言。我使用CodeDom命名空間從我的程序中編譯C#腳本文件。 – 2013-04-20 03:44:31

+0

天啊! C#是你的腳本?你確定? – David 2013-04-20 03:45:07

回答

2

特別是對於自動完成,您需要使用兩個系統:解析器和反射。

從理論上講,解析器是一個非常簡單的概念,但我相信,要爲具有儘可能多的語法糖和與C#一樣多的上下文敏感關鍵字的語言編寫語言並不容易。

由於.NET本身具有反射性,並提供反射框架,所以該部分也不應該令人難以置信地痛苦。反射允許您將包含已編譯程序集的面向對象元素以及程序集本身作爲對象進行操作。例如,一種方法將是一個Method對象。你可以通過檢查Type課程的成員來了解這個系統,這爲反思提供了一個基本的起點。另一個有用的起點是Assembly。像往常一樣,MSDN擁有豐富的結構化格式的「官方」信息。

+0

您的方法適用於已編譯的系統。我想要的是Visual Studio風格的Intellisense,它甚至在代碼編譯之前就可以工作。 – 2013-04-20 06:28:38

+0

這意味着你正在編譯它。同樣的想法。你仍然可以使用反射;該框架已經到位。你基本上正在編譯一個面向對象的shell。你需要爲局部變量做一些自定義的事情,但這只是一個元素。 – Zenexer 2013-04-20 06:33:49