2008-10-13 30 views
7

Tôi đang sử dụng System.Reflection.Emit trong một thời gian, và tìm thấy nó (những người không?) Đau đớn như dễ bị lỗi.Có một trình bao bọc tốt xung quanh ILGenerator không?

Bạn có biết nếu có trình bao bọc tốt xung quanh Bộ tạo IL, điều gì đó mà tôi có thể dựa vào để phát ra IL theo cách an toàn hơn và dễ dàng hơn so với chơi trực tiếp với SRE không?

Edit:

Tôi biết rằng thao tác cây biểu thức là dứt khoát dễ dàng hơn và an toàn hơn phát ra IL trực tiếp, nhưng họ cũng có một số hạn chế về ngay bây giờ. Tôi không thể tạo các khối mã, sử dụng vòng lặp, khai báo và làm việc với một số người dân địa phương, vv Chúng tôi cần phải đợi cho đến khi .NET 4 xuất hiện :)

Hơn nữa, tôi đang xử lý một cơ sở mã dựa trên SRE.

Rõ ràng, ILGenerator làm mọi thứ tôi cần. Nhưng tôi sẽ đánh giá cao sự hỗ trợ hơn khi thao túng nó. Khi tôi đề cập đến một wrapper ILGenerator, mà vẫn ở mức khá thấp, tôi nghĩ về một cái gì đó mà có thể cung cấp các phương pháp như:

// Performs a virtual or direct call on the method, depending if it is a 
// virtual or a static one. 
Call(MethodInfo methodInfo) 

// Pushes the default value of the type on the stack, then emit 
// the Ret opcode. 
ReturnDefault(Type type) 

// Test the object type to emit the corresponding push 
// opcode (Ldstr, Ldc_I*, Ldc_R*, etc.) 
LoadConstant(object o) 

Nó thực sự 3 ví dụ ngây thơ, nhưng nó có thể là đủ để chứng minh những gì tôi chờ đợi. Chúng ta có thể thấy rằng như là một tập hợp các phương pháp mở rộng, nhưng nó có thể được tốt đẹp để có hỗ trợ cho các điều kiện báo cáo và vòng như trong RunSharp. Trong thực tế, RunSharp là khá gần mà những gì tôi muốn, nhưng nó tóm tắt ILGenerator quá nhiều và không phơi bày tất cả các chức năng của nó.

Tôi không thể nhớ ở đâu, nhưng tôi đã thấy một người trợ giúp như vậy trong một dự án nguồn mở.

+0

Bạn chưa chỉ định ILGenerator không làm gì và trình bao bọc 'tốt' sẽ làm gì. –

+0

Đó là điểm hợp lệ; Tôi đã cập nhật câu hỏi để cung cấp thêm chi tiết. –

+0

Thực ra, vì Biểu thức là các biểu thức lambda, bạn sẽ có thể sử dụng vòng lặp, được thực hiện như toán tử đệ quy + Y. – TraumaPony

Trả lời

6

Nếu bạn đang sử dụng .NET 3.5, bạn có thể tìm thấy bằng cách sử dụng Cây biểu thức để hợp lý hơn. Nó hoàn toàn phụ thuộc vào những gì bạn đang làm - và nó vẫn có thể khá đau đớn - nhưng nó chắc chắn là một lựa chọn khác để nhận thức được.

+0

Thật không may, tôi vẫn còn với .NET 2.0. Tôi có thể sử dụng Mono thực hiện lớp Expression, nhưng cây biểu thức không thể xử lý những gì tôi muốn làm (mã blocs, phân bổ địa phương, vv) –

+0

Cây mở rộng không hữu ích khi triển khai các kiểu phức tạp. Chỉ khi làm việc với các phương thức. –

4

[cập nhật]: Tôi đã nghĩ đến tên ;-p RunSharp. Tôi không thể xác minh cho nó, nhưng nó có thể là những gì bạn cần.

Tuy nhiên; bạn cần gì để tạo ra? CodeDom là một tùy chọn. Để tạo phương pháp, bạn có thể thấy rằng bạn có thể làm nhiều hơn bạn mong đợi với lớp Expression trong .NET 3.5 (sau khi biên dịch nó thành một đại biểu đã gõ qua Expression.Lambda/Compile.

+0

Tôi biết về RunSharp và tôi đang tìm kiếm thứ gì đó tương tự ở mức thấp hơn. Tôi thích tránh xa CodeDom, ngay cả khi nó là một giải pháp tốt trong nhiều trường hợp. Tôi bị mắc kẹt với DynamicMethods hầu hết thời gian. –

+0

OK; suy nghĩ nhỏ, nhưng bạn có thể đã bao gồm này (và yêu cầu 2.0 của bạn) trong câu hỏi ban đầu ... Re "cấp thấp hơn" - loại cấp (giữa RunSharp và ILGenerator) là bạn đang tìm kiếm? –

+0

Bạn nói đúng, tôi đã thêm một số thông tin khác trong câu hỏi gốc. Cảm ơn bạn đã giúp đỡ! –

2

Hãy thử sử dụng Mono.Cecil

Cecil là một thư viện được viết bởi Jb Evain để tạo và kiểm tra các chương trình và các thư viện trong định dạng ECMA Cil. Nó có hỗ trợ đầy đủ cho generics, và hỗ trợ một số định dạng biểu tượng gỡ lỗi.

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