Tôi đã viết một gói, SharpByte.Dynamic , để đơn giản hóa tác vụ biên dịch và thực thi mã động. Mã có thể được gọi trên bất kỳ đối tượng ngữ cảnh nào bằng cách sử dụng các phương thức mở rộng như được trình bày chi tiết ở đây .
Ví dụ,
someObject.Evaluate<int>("6 / {{{0}}}", 3))
trả về 3;
someObject.Evaluate("this.ToString()"))
trả về biểu diễn chuỗi của đối tượng ngữ cảnh;
someObject.Execute(@
"Console.WriteLine(""Hello, world!"");
Console.WriteLine(""This demonstrates running a simple script"");
");
chạy các câu lệnh đó như một tập lệnh, v.v.
Các tệp thực thi có thể được lấy dễ dàng bằng cách sử dụng phương thức gốc, như được thấy trong ví dụ ở đây - tất cả những gì bạn cần là mã nguồn và danh sách bất kỳ tham số được đặt tên dự kiến nào (mã thông báo được nhúng bằng ký hiệu dấu ngoặc kép, chẳng hạn như {{{0}} }, để tránh xung đột với string.Format () cũng như các cú pháp giống như Handlebars):
IExecutable executable = ExecutableFactory.Default.GetExecutable(executableType, sourceCode, parameterNames, addedNamespaces);
Mỗi đối tượng thực thi (tập lệnh hoặc biểu thức) đều an toàn theo luồng, có thể được lưu trữ và sử dụng lại, hỗ trợ ghi nhật ký từ bên trong tập lệnh, lưu trữ thông tin thời gian và ngoại lệ cuối cùng nếu gặp phải, v.v. Ngoài ra, có một phương thức Copy () được biên dịch trên mỗi tập lệnh để cho phép tạo các bản sao rẻ tiền, tức là sử dụng một đối tượng thực thi được biên dịch từ tập lệnh hoặc biểu thức làm mẫu để tạo các đối tượng khác.
Chi phí thực thi một tập lệnh hoặc câu lệnh đã được biên dịch tương đối thấp, chỉ dưới một micro giây trên phần cứng khiêm tốn và các tập lệnh và biểu thức đã được biên dịch được lưu vào bộ nhớ đệm để sử dụng lại.