2013-03-01 38 views
9

Các bài viết tôi đã đọc trên T4 sử dụng TextTemplatingFilePreprocessor cho thấy cách tạo mã động trở thành một phần của dự án và được biên dịch với dự án.Biên dịch mã động khi chạy bằng T4 và C#

Có thể sử dụng T4 để tạo mã được biên dịch trong thời gian chạy, được xuất thành dll và được tải và thực thi không, với mã được truy cập có khả năng hiển thị thông thường được liên kết với dll không?

Nếu có, vui lòng chỉ cho tôi một ví dụ.

Tôi đang cố gắng thực hiện điều tương tự như tạo ra một dll động sử dụng IL, nhưng thay vì sử dụng C#.

EDIT

Các trường hợp cụ thể tôi cần điều này là dễ hiểu. Tôi đang viết một bộ định tuyến tin nhắn định tuyến các tin nhắn đến các dịch vụ. Các dịch vụ có thể là cục bộ hoặc từ xa. Một kịch bản khai báo được biên dịch thành C#. Phần năng động là "dịch vụ này là cục bộ hay từ xa?". Đầu ra C# được thay đổi tương ứng. Kiểu định tuyến là khác nhau cho địa phương/từ xa, do đó tính chất động.

Đây là một ví dụ về những gì tôi cần.

+0

Tôi không chắc chắn bạn cần tạo mã cho điều đó. Bạn không thể có hai loại: một cho dịch vụ địa phương và một cho từ xa và chọn thời gian chạy mà một trong những sử dụng? – svick

+0

Chắc chắn, ngay cả một tuyên bố đơn giản nếu kết nối đại biểu chính xác. Tôi chỉ sử dụng điều này như là một ví dụ đơn giản của * a * trường hợp động sẽ có lợi. Tôi có nhiều trường hợp phức tạp hơn mà tôi chưa hoàn toàn được vạch ra. – IamIC

Trả lời

4

Để làm điều này, bạn cần phải biết hai điều:

  1. Bạn có thể sử dụng mẫu runtime T4 để tạo ra một số văn bản trong thời gian chạy, bao gồm cả mã nguồn C#.
  2. Bạn có thể sử dụng CSharpCodeProvider để biên dịch một hội đồng từ văn bản vào thời gian chạy. Hoặc bạn có thể chạy thủ công csc.exe (trình biên dịch dòng lệnh C#) trên văn bản được tạo ra, nhưng điều đó sẽ phức tạp hơn. (Trên thực tế CSharpCodeProvider thực hiện chính xác rằng đằng sau hậu trường.)

Mã này có thể trông như thế này:

var template = new RuntimeTextTemplate(); 
string code = template.TransformText(); 

var compiler = new CSharpCodeProvider(); 
var result = compiler.CompileAssemblyFromSource(
    new CompilerParameters { OutputAssembly = "assembly.dll" }, code); 
+0

bạn có thể chỉ cho tôi điều gì đó cho thấy cách T4 có thể đánh giá dữ liệu khi chạy (dữ liệu tự nhiên xác định đầu ra). – IamIC

+1

@IanC Nếu bạn tạo mẫu thời gian chạy, nó sẽ được đánh giá khi chạy (như trong mẫu mã của tôi). Để sửa đổi đầu vào của mẫu, bạn có thể sử dụng các thuộc tính trong “Các khối điều khiển tính năng lớp”, sau đó bạn có thể truy cập từ mẫu đó. – svick

+0

Có một bài đăng thú vị từ @ ode2code http://odetocode.com/blogs/scott/archive/2011/01/04/preprocessed-t4-templates.aspx trong đó cho thấy cách thêm một số dữ liệu đơn giản trong một lớp một phần là tốt, đó là một kỹ thuật rất nhiều người như với các mẫu thời gian chạy. – GarethJ

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