Như một chút mới lạ, tôi đang cố gắng xem IL khác nhau như thế nào từ mã trọng lượng nhẹ được tạo ra khi chạy vs mã được tạo bởi trình biên dịch VS, vì tôi nhận thấy rằng mã VS có xu hướng chạy với một cấu hình hiệu suất khác nhau cho những thứ như phôi.Làm thế nào để tôi nhận được IL bytearray từ một DynamicMethod?
Vì vậy, tôi đã viết đoạn mã sau ::
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Thật không may, điều này ném một ngoại lệ như GetMethodBody là dường như một hoạt động bất hợp pháp trên mã được tạo bởi cây biểu thức. Làm cách nào tôi có thể theo cách thư viện (tức là không có công cụ bên ngoài trừ khi công cụ có API) nhìn vào mã được tạo bằng mã bằng cách sử dụng codegen nhẹ?
Chỉnh sửa: lỗi xảy ra trên dòng 5, biên dịch.Method.GetMethodBody() ném ngoại lệ.
Chỉnh sửa2: Có ai biết cách khôi phục các biến cục bộ được khai báo trong phương pháp không? Hoặc là không có cách nào để GetVariables?
Dòng nào đang ném ngoại lệ? Bạn có thể bình luận ra Array.ForEach đầu tiên và xem liệu nó có hiệu quả không?Tôi nghi ngờ rằng các cuộc gọi đầu tiên để GetMethodBody() là không đơn giản chỉ vì biểu hiện đó đã không được biên dịch để IL. Tôi không thấy lý do tại sao cuộc gọi thứ hai sẽ thất bại. – cdhowie
Câu hỏi thú vị. Tôi nhận được một InvalidOperationException ("Hoạt động không hợp lệ do trạng thái hiện tại của đối tượng") trong cuộc gọi GetMethodBody. Tôi không chắc chắn làm thế nào bắt đầu cuộc sống như một CachedAnonymousDelegate vs Expression sẽ ảnh hưởng đến hành vi của bạn như là một Func. Tôi sẽ tiếp tục làm việc này. – Sorax
Câu trả lời được chọn nên được chuyển vì nó không bao gồm tất cả các trường hợp và phức tạp không cần thiết. Vui lòng xem [câu trả lời này] (http://stackoverflow.com/a/35711507/521757). – jnm2