2009-09-01 41 views
8

Chỉ cần tự hỏi liệu có bất kỳ hàm dựng sẵn nào trong C++ OR C# cho phép bạn sử dụng trình biên dịch khi chạy không? Ví dụ như nếu tôi muốn dịch:Biên dịch chuỗi đơn giản

!print "hello world"; 

thành:

MessageBox.Show("hello world"); 

và sau đó tạo ra một exe mà sau đó sẽ có thể hiển thị thông điệp trên? Tôi đã nhìn thấy dự án mẫu trên web vài năm trước đây đã làm điều này nhưng không thể tìm thấy nó nữa.

Trả lời

15

Có thể sử dụng C#. Hãy xem điều này Sample Project từ CodeProject.

Mã Extract

private Assembly BuildAssembly(string code) 
{ 
    Microsoft.CSharp.CSharpCodeProvider provider = new CSharpCodeProvider(); 
    ICodeCompiler compiler = provider.CreateCompiler(); 
    CompilerParameters compilerparams = new CompilerParameters(); 
    compilerparams.GenerateExecutable = false; 
    compilerparams.GenerateInMemory = true; 
    CompilerResults results = compiler.CompileAssemblyFromSource(compilerparams, code); 
    if (results.Errors.HasErrors) 
    { 
     StringBuilder errors = new StringBuilder("Compiler Errors :\r\n"); 
     foreach (CompilerError error in results.Errors) 
     { 
      errors.AppendFormat("Line {0},{1}\t: {2}\n", error.Line, error.Column, error.ErrorText); 
     } 
     throw new Exception(errors.ToString()); 
    } 
    else 
    { 
     return results.CompiledAssembly; 
    } 
} 

public object ExecuteCode(string code, string namespacename, string classname, string functionname, bool isstatic, params object[] args) 
{ 
    object returnval = null; 
    Assembly asm = BuildAssembly(code); 
    object instance = null; 
    Type type = null; 
    if (isstatic) 
    { 
     type = asm.GetType(namespacename + "." + classname); 
    } 
    else 
    { 
     instance = asm.CreateInstance(namespacename + "." + classname); 
     type = instance.GetType(); 
    } 
    MethodInfo method = type.GetMethod(functionname); 
    returnval = method.Invoke(instance, args); 
    return returnval; 
} 
+0

Người dùng phải cài đặt trình biên dịch C#? Hoặc điều đó đi kèm với .NET? Theo http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx, chức năng này được bao gồm trong System.dll. – XXXXX

+0

Nó đi kèm với .NET – Dario

5

Trong C++ bạn không thể sử dụng trình biên dịch tại thời gian chạy nhưng bạn có thể nhúng một thông dịch viên trong dự án của bạn, giống như CINT.

+0

hmmm thú vị, tôi đang kiểm tra điều đó ngay bây giờ - cảm ơn bạn rất nhiều :) –

3

Bạn luôn có thể làm điều đó theo cách bẩn, với hệ thống() và gọi trình biên dịch " gcc ... "hoặc tương đương

1

đề nghị của Nick là tốt, nhưng có một sự thay thế mà có lẽ đơn giản để thực hiện (nhưng có thể không thích hợp cho tất cả các dự án). Nếu bạn có thể giả định rằng người dùng của bạn đã cài đặt trình biên dịch, bạn có thể tạo một tệp và sau đó biên dịch nó bằng trình biên dịch của họ.

1

.NET-framework cung cấp một vài lớp cho phép bạn truy cập vào trình biên dịch và trình tạo mã cho C# và VB.NET, kết quả là một assembly được nạp vào bộ nhớ hoặc một tệp .exe đơn giản. Xem CSharpCodeProviderthis article.

Cách khác, bạn chỉ có thể tạo tệp nguồn và biên dịch chúng theo cách thủ công (gọi dòng lệnh (system) tới trình biên dịch, makefiles). Liên quan đến bản dịch nguồn của bạn: Bạn sẽ phải sử dụng các cơ chế phân tích cú pháp như biểu thức chính quy tại đây hoặc sử dụng công cụ biên dịch trình biên dịch như Coco/R, yacc, v.v. (Lưu ý rằng dưới C++, boost::spirit cũng có thể khá hữu ích)

1

Trong C# bạn có thể tạo cây .NET "CodeDom" và sau đó biên dịch bằng trình biên dịch .NET. Điều này cho phép bạn truy cập đầy đủ vào hầu hết các tính năng của .NET.

Xem không gian tên "System.CodeDom" hoặc MSDN help for CodeCompileUnit để biết chi tiết.

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