2011-06-27 46 views
7

tôi đã cố gắng để tạo ra IL cho phương pháp đệ quy sử dụng chiến lược sau đây, Trước hết tôi định nghĩa kiểu sử dụng đoạn mã sauTạo IL cho đệ quy phương pháp

private void InitializeAssembly(string outputFileName) 
     { 
      AppDomain appDomain = AppDomain.CurrentDomain; 
      AssemblyName assemblyName = new AssemblyName(outputFileName); 
      assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, 
                   AssemblyBuilderAccess.Save); 
      moduleBuilder = assemblyBuilder.DefineDynamicModule(outputFileName, outputFileName + ".exe"); 
      typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Public); 
      methodBuilder = typeBuilder.DefineMethod("Main", 
            MethodAttributes.Static | MethodAttributes.Public, 
            typeof(void), 
            System.Type.EmptyTypes); 
      ilGen = methodBuilder.GetILGenerator(); 

     } 

Tiếp theo, tôi bắt đầu để tạo ra IL cho phương pháp đệ quy như đưa ra dưới đây.

Đối với phương pháp tự xưng là bên trong cơ thể phương pháp tôi đã sử dụng sau xây dựng,

ilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc})); 

Cuối cùng lưu tạo lắp ráp sử dụng phương pháp sau đây.

private void SaveAssembly(string outputFileName) 
     { 
      ilGen.Emit(OpCodes.Ret); 
      typeBuilder.CreateType(); 
      moduleBuilder.CreateGlobalFunctions(); 
      assemblyBuilder.SetEntryPoint(methodBuilder); 
      assemblyBuilder.Save(outputFileName + ".exe"); 
     } 

Thật không may điều này không hoạt động kể từ khi xây dựng phương thức gọi đệ quy, bên trong phương thức trả về giá trị rỗng. Vấn đề ở đây là cuộc gọi đệ quy bên trong phương thức (ví dụ: ilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc})); ) trả về giá trị rỗng. Vì chúng tôi thực sự tạo loại bên trong phương thức SaveAssembly(), điều này có thể chấp nhận được. Vì vậy, câu hỏi của tôi là: là nó có thể tạo ra IL cho các phương pháp đệ quy bằng cách sử dụng xây dựng trên? Nếu không thể, hãy cho tôi biết rằng các cấu trúc thay thế để tạo IL cho các phương thức đệ quy.

Trả lời

7

tôi đã không kiểm tra nó, nhưng nếu tôi nhớ chính xác bạn sẽ có thể chỉ cần sử dụng kết quả của DefineMethod để phát ra các hướng dẫn Call:

MethodBuilder method = typeBuilder.DefineMethod("MethodName", ...); 
... 

ILGenerator ilOfMethod = method.GetILGenerator(); 

... 
ilOfMethod.Emit(OpCodes.Call, method); 
+0

Chỉ cần về để gửi cùng. ['MethodBuilder'] (http://msdn.microsoft.com/en-us/library/system.reflection.emit.methodbuilder.aspx) thừa kế từ' MethodInfo', vì vậy có vẻ hợp lệ ở đó. –

+0

+1 Cảm ơn rất nhiều! Đề xuất của bạn hoạt động và tôi có thể tạo IL cho các phương thức đệ quy –

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