2013-04-20 28 views
7

Tôi đã phát triển một ứng dụng sử dụng tập tin script C# cho một số cấu hình và cài đặt nhất định. Tệp kịch bản chứa nhiều đối tượng được tạo khác nhau và một số chức năng nhất định trên các đối tượng đó. Hiện tại, người dùng phải tạo tệp .cs bằng trình chỉnh sửa của bên thứ ba và cung cấp đường dẫn đến chương trình của tôi để sử dụng nó. Những bất lợi với phương pháp này là người dùng không có sự linh hoạt của tự động hoàn thành và hỗ trợ intellisense-esque trong khi chỉnh sửa các tập tin kịch bản.Sử dụng C# làm ngôn ngữ kịch bản cho ứng dụng C#

Tôi muốn nhúng phần chỉnh sửa tập lệnh vào ứng dụng của mình. Tôi có thể làm điều đó bằng cách sử dụng một trình soạn thảo văn bản phong phú. Nhưng mã hóa phần tự động hoàn thành là một nỗi đau lớn. Có cách nào để tôi có thể cung cấp cho người dùng một trình chỉnh sửa trong chương trình cũng tự động hoàn thành ....

Mã để biên dịch một kịch bản động trong một chương trình.

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 hoặc powerscript? Bạn đang sử dụng ngôn ngữ kịch bản nào? – David

+1

C# chính nó là ngôn ngữ kịch bản của tôi. Tôi đang sử dụng không gian tên CodeDom để biên dịch tập tin C# script ngay lập tức từ bên trong chương trình của tôi. –

+0

ôi chúa ơi! C# là kịch bản của bạn? Bạn có chắc không? – David

Trả lời

2

Cụ thể để tự động hoàn thành, bạn sẽ cần sử dụng hai hệ thống: trình phân tích cú pháp và phản chiếu.

Trình phân tích cú pháp là một khái niệm khá đơn giản, nhưng tôi chắc chắn rằng sẽ không dễ dàng viết cho một ngôn ngữ có nhiều đường cú pháp và nhiều từ khóa theo ngữ cảnh như C#.

Vì .NET vốn đã phản chiếu và cung cấp một khung phản chiếu, phần đó cũng không nên gây đau đớn. Sự phản chiếu cho phép bạn thao tác các phần tử hướng đối tượng bao gồm các assembly được biên dịch - và các assembly của chúng - như các đối tượng. Ví dụ, một phương thức sẽ là đối tượng Method. Bạn có thể xem qua hệ thống này bằng cách kiểm tra các thành viên của lớp Type, cung cấp một điểm khởi đầu cơ bản để phản chiếu. Một điểm khởi đầu hữu ích khác là Assembly. MSDN, như thường lệ, có rất nhiều thông tin "chính thức" ở định dạng có cấu trúc.

+0

Phương pháp của bạn hoạt động trên các hệ thống đã được biên dịch. Những gì tôi muốn là Visual Studio phong cách Intellisense, mà làm việc ngay cả trước khi mã được biên dịch. –

+0

Mà về cơ bản có nghĩa là bạn đang biên dịch nó khi bạn đi. Cùng một ý tưởng. Bạn vẫn có thể sử dụng sự phản chiếu; khuôn khổ được đặt ra. Về cơ bản, bạn đang biên dịch một trình bao hướng đối tượng. Bạn sẽ cần phải làm một cái gì đó tùy chỉnh cho các biến địa phương, nhưng đó chỉ là một yếu tố. – Zenexer

Các vấn đề liên quan