2010-06-24 37 views
5

Tôi nhớ khi .NET 4 ở phiên bản beta, có một video của nhà phát triển đã tạo một ứng dụng dòng lệnh để có thể nhập mã C# vào và nó sẽ biên dịch mã khi đang chạy. Ý tưởng là trình biên dịch đã có sẵn trong ngôn ngữ .NET.Biên dịch mã .NET trong .NET 4?

Bất cứ ai cũng nhớ nơi này? Tôi cần tạo một ứng dụng với một ngôn ngữ macro nhỏ và tôi rất thích sử dụng C# làm ngôn ngữ macro đó, nhưng tôi không biết phải tìm thư viện này ở đâu ..

Trả lời

11

Bạn có thể sử dụng CSharpCodeProvider class để biên dịch các hội đồng khi chạy.

Bạn sẽ cần tạo mẫu soạn sẵn để bao bọc các lệnh macro trong một phương thức tĩnh trong một lớp.

Ví dụ:

static readonly Assembly[] References = new[] { typeof(Enumerable).Assembly, typeof(Component).Assembly }; 
public Action CompileMacro(string source) { 
    var options = new CompilerParameters(References.Select(a => a.Location).ToArray()) { 
     GenerateInMemory = true 
    }; 
    string fullSource = @"public static class MacroHolder { public static void Execute() { \r\n" + source + "\r\n} }"; 
    try { 
     var compiler = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } }); 

     var results = compiler.CompileAssemblyFromSource(options, fullSource); 

     if (results.Errors.Count > 0) 
      throw new InvalidOperationException(String.Join(
       Environment.NewLine, 
       results.Errors.Cast<CompilerError>().Select(ce => ce.ErrorText) 
      )); 

     return (Action)Delegate.CreateDelegate(
      typeof(Action), 
      results.CompiledAssembly.GetType("MacroHolder").GetMethod("Execute") 
     ); 
    } finally { options.TempFiles.Delete(); } 
} 
+4

Đây là câu trả lời duy nhất hiện có. Video bạn đang đề cập đến là việc chứng minh các "biên dịch như một dịch vụ", được dự kiến ​​lên kế hoạch cho C# 5. –

+0

Xem thêm: http://stackoverflow.com/questions/2210734/what-is-the-state-of -the-c-compiler-as-a-service –

+0

Rất tốt, cảm ơn sự giúp đỡ của mọi người! – Kelly

2

Không chắc chắn nơi bạn đang đề cập đến còn nữa, nhưng những gì bạn đang nói đến là một Interactive Shell.

Người duy nhất tôi nhớ lại là CSharpRepl do nhóm Mono phát hành. CSharpRepl cũng chứa hàm Compiler As a Service mà nhóm Mono đã phát triển.

0

Có lẽ bạn có nghĩa là CodePad.NET? Vâng, nó không phải là một ứng dụng dòng lệnh nhưng nó là mã nguồn mở và có thể chỉ cho bạn đi đúng hướng.

1

Bạn có thể thử CS-Script làm phương án thay thế - cho phép bạn chạy các tệp C# riêng lẻ như thể chúng là tệp tập lệnh.

1

Nếu bạn đang mở các đề xuất khác, bạn có thể sử dụng Python hoặc F # hoặc Boo làm ngôn ngữ macro ngay hôm nay.

Tôi thích Python, bản thân mình; đó là một trong những ngôn ngữ được thiết kế tốt nhất. C# đã vay mượn rất nhiều từ Python trong những phát triển sau này của nó (các khối lặp, lambdas, ...).

Xuất bản tác phẩm có cuốn sách có tên IronPython in Action; Chương 15 là tất cả về cách sử dụng IronPython trong các chương trình khác (như là một công cụ kịch bản, hoặc như bổ sung).

0

Tôi sẽ không sử dụng Python, nó không có cơ sở hạ tầng .NET, do đó bạn bị giới hạn.

F # thật tuyệt vời.

+3

Ý của bạn là gì bởi "không có cơ sở hạ tầng .NET"? IronPython là một ngôn ngữ .NET hạng nhất. – Niki

0

The-as-a-Service Compiler tính năng đã được available in Mono trong một thời gian khá lâu và có những dấu hiệu cho thấy nó có thể xuất hiện trong .NET 5 hoặc 6, nhưng nó không có sẵn trong .NET 4.

Nếu bạn hoàn toàn, tích cực, cần phải chạy trên NET (lưu ý rằng Mono chạy trên Windows tốt, vì vậy bạn không thực sự mất bất cứ điều gì bằng cách chạy Mono), một trong những lựa chọn thú vị có thể là để điều tra như thế nào cứng nó sẽ được cổng Mono.CSharp đến. MẠNG LƯỚI. Tôi có nghĩa là, cuối cùng, tại một số điểm, nó tạo ra bytecode CIL hoạt động chính xác như nhau trên tất cả các triển khai CLI cho dù đó là Mono, .NET, DotGNU, Rotor, Bartok hay bất cứ thứ gì.

Nếu không, các tùy chọn của bạn khá giống nhau: tạo tệp và gọi trình biên dịch dòng lệnh, sử dụng cây DLR, sử dụng tạo mã nhẹ, sử dụng Reflection.Emit, sử dụng CodeDOM, sử dụng CSharpCodeProvider, tạo ngôn ngữ kịch bản của riêng bạn, lưu trữ một số ngôn ngữ kịch bản khác hoặc lưu trữ DLR.

Có lẽ tôi sẽ chọn thứ hai: lưu trữ DLR là hoàn toàn dễ dàng và nó cho phép bạn truy cập không chỉ một ngôn ngữ lập trình tốt (tại thời điểm Ruby, Python, ECMAScript và Scheme) và trên thực tế người dùng có thể sử dụng bất kỳ ngôn ngữ DLR nào mà họ đã cài đặt trên máy của họ.

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